인터페이스 인터페이스란 실제 메소드를 정의하고 구현하는 것이 아니라 메소드의 헤더 부분(시그니처)만 선언하며, 이 메소드를 실제 정의하는 클래스에서 메소드 본체를 완성하는 것을 말한다. 개발 코드와 객체가 서로 통신하는 접점 역할을 하는데 개발 코드가 인터페이스의 메소드를 호출하면 인터페이스는 객체의 메소드를 호출시킨다. 여기서 개발 코드가 직접 객체의 메소드를 호출하면 되는데 왜 중간에 인터페이스를 두는 것인지 의문이 생길 수도 있다. 그 이유는 개발 코드를 수정하지 않고 사용하는 객체를 변경할 수 있도록 하기 위해 인터페이스를 사용하는 것이라고 할 수 있다. 즉, 코드 변경 없이 실행 내용과 리턴 값을 다양화할 수 있다는 장점을 가지게 된다는 것이다. 인터페이스는 상수 필드와 추상 메소드만을 구성 멤..
사전적 의미로 추상은 실체 간에 공통되는 특성을 추출한 것을 말한다. 추상 클래스 객체를 직접 생성할 수 있는 클래스를 실체 클래스라고 한다면 이 클래스들의 공통적인 특성을 추출해서 선언한 클래스를 추상 클래스라고 한다. 즉, abstract 키워드가 붙는 클래스는 객체로 인스턴스를 생성할 수 없다는 뜻이다. 그리고 실체 클래스와 추상 클래스는 상속 관계를 가지고 있다. 이러한 추상 클래스의 예로 동물을 들 수 있다. 동물 클래스는 현실 세계에 실체가 없으므로 abstract를 사용한 추상 클래스라고 할 수 있고, 실제로 존재하는 물고기, 새 등이 실체 클래스라고 할 수 있다. public abstract class AbstractCalc { int add(int x, int y) { return x+y..
부모 생성자를 호출하는 super() super()는 부모의 기본 생성자를 호출하기 위해서 사용한다. 만약에 자식 클래스의 생성자가 명시적으로 생성되지 않는다면 컴파일러는 아래와 같은 기본 생성자를 생성한다. public 자식 클래스명(){ super(); } 기본 생성자를 추가해주는 것은 앞에서 정리한 내용이라 익숙한데 super()라는 코드가 새롭게 추가된 것을 볼 수 있다. 자바 컴파일러는 부모 클래스의 생성자를 명시적으로 호출하지 않는 모든 자식 클래스의 생성자 첫 줄에 자동으로 super()를 추가하여, 부모 클래스의 멤버를 초기화할 수 있도록 해준다. 만약 직접 자식 생성자를 선언하고 명시적으로 부모 생성자를 호출하고 싶다면 아래와 같이 작성하면 된다. 자식 클래스명(매개변수1, 매개변수2, ..
아직 MVC 패천에 대해서 깊게 배우지 않았기 때문에 MVC가 각각 무엇을 뜻하는지 정도만 정리하고 그 이상은 추후에 정리하도록 하겠다. MVC는 개발할 때 사용되는 디자인 패턴을 말한다. M은 Model, V는 View, C는 Controller를 뜻한다. 하나씩 알아가보자. Model 데이터를 가진 객체를 말한다. DAO (Data Access Object) 데이터베이스의 데이터 접근하기 위한 객체로 DB에 접근하기 위한 로직을 분리하기 위해 사용한다. 직접 DB에 접근해서 데이터를 CRUD를 한다. DTO (Data Transfer Object) 계층 간 데이터 교환을 위한 역할을 하고, 로직을 가지지 않는 객체이며 getter와 setter 메소드만 가진 클래스를 의미한다. VO (Value Ob..
일반적으로 객체 지향 프로그래밍에서는 객체의 필드를 객체 외부에서 직접적으로 접근하는 것을 막는다. 왜냐하면 외부에서 마음대로 변경할 경우 객체의 무결성(의도하지 않은 요인에 의해 데이터, 시스템 등이 변경되거나 손상되지 않고 완전성, 일관성 등을 보장하는 특성)이 깨질 수 있기 때문이다. 예를 들어서 나이나 속도는 음수가 될 수 없는데 외부에서 음수로 변경한다면 무결성이 깨지게 되는 것이다. 그렇기 때문에 객체 지향 프로그래밍에서는 메소드를 통해서 필드를 변경해야 한다. 클래스를 선언할 때 필드(멤버 변수)는 private로 선언해서 외부로부터 보호하고, 필드는 getter와 setter 메소드를 이용해서 읽어오고 사용하는 것이 좋다. 그렇다면 getter와 setter가 무엇일까? getter와 se..
접근 제한자 종류 1) public : 외부 클래스가 자유롭게 사용할 수 있다. package practice.ex1; public class PublicEx { public int a = 10; } package practice.ex1;// 같은 패키지 public class Test { public static void main(String[] args) { PublicEx publicEx = new PublicEx(); System.out.println(publicEx.a);// 출력 가능 } } package practice.ex2;// 다른 패키지 import practice.ex1.PublicEx; public class Test { public static void main(String[] ..
오버로딩에 대해서는 앞에서 다룬 적이 있다. 비슷한 단어지만 뜻은 완전히 다른 오버라이딩과 같이 비교를 해보도록 하자. 오버로딩 클래스내에 같은 이름의 메소드를 여러 개 선언하는 것을 오버로딩이라고 한다. 오버로딩의 조건 1. 메소드 이름은 같아야 한다. 2. 매개 변수의 개수나 타입이 달라야 한다. 리턴 타입은 아무런 상관이 없다는 것에 유의하자. public class OverloadingEx { void print() { System.out.println("매개변수가 없는 오버로딩 예제1"); } void print(int a) { System.out.println("매개변수가 int형인 오버로딩 예제2"); } void print(int a, String s) { System.out.println..
이전에 멤버 변수를 설명하면서 클래스 변수를 설명하면서 static 단어를 잠깐 언급한 적이 있다. 인스턴스 멤버와 정적 멤버를 다시 한번 더 정리하면서 static에 대해 알아보도록 하자. 인스턴스 멤버와 this 인스턴스 멤버란 객체를 생성한 후 사용할 수 있는 필드와 메소드라고 말할 수 있다. 객체 내부에서 인스턴스 멤버에 접근하기 위해 this를 사용해야 한다. 저번에 생성자를 설명하면서 말했던 것처럼 this는 객체 자신을 가르킨다. 생성자와 메소드의 매개 변수 이름이 필드와 동일한 경우 인스턴스 멤버인 필드를 명시하고 할 때 사용한다. Car(String company){ this.company = company; } 즉, 위의 코드는 매개 변수 company의 값을 필드 company에 저장..