eud day 20
Object 클래스는 모든 클래스의 최상위 클래스이다. 명시적으로 extends을 하지 않아도 자동으로 상속을 받는다.
따라서 모든 클래스는 Object 클래스의 메서드를 선언 없이 사용할 수 있고 오버라이딩 메서드를 작성하는 것도 가능하다.
또한 다형성을 적용하면 Object타입의 변수는 모든 데이터를 저장할 수 있다.
자주 쓰이는 메서드 2가지만 살펴보겠다.
기본 데이터형의 비교는 == 연산자를 이용하지만 String 클래스처럼 참조형인 경우에는 반드시 equals 메서드를 이용한다.
Alt + Shift + S 커맨드를 사용하면 equals 메서드를 추가할 수 있다.
Object 클래스에 있는 toString() 메서드는 객체를 문자열로 변경시키는 메서드이다.
toString() 메서드는 "클래스명@16진수위치값" 포맷의 문자열로 반환하도록 구현되어 있는데, 이 메서드는 객체를 참조하는 참조형 변수는 print 및 println 메서드를 사용하여 콘솔에 출력할 때 자동으로 호출된다. (객체를 문자열로 변경시켜야 콘솔에 출력이 가능하기 때문이다)
Object 클래스의 toString 메서드에 관한 내용 정리

앞에서 배운 상속은 객체지향 프로그래밍의 핵심기능으로서 상속을 적용하면 코드의 재사용 및 다형성, 오버라이딩 메서드등과 같은 다양한 객체지향적인 프로그램 기법을 적용할 수 있었다.
하지만 상속은 강제성이 없기 때문에 상속을 적용시켜도 사용하지 않고 자신만의 메서드를 작성하여 사용한다면 상속을 사용하는 장점을 얻을 수 없다.
그래서 재사용성 및 유지보수를 향상시키기 위해 하위 클래스에서 반드시 부모 클래스의 메서드를 사용하게끔 강제할 필요성이 등장했다.
자바는 인터페이스와 추상 클래스를 통해서 하위 클래스들에게 부모의 메서드를 반드시 사용하도록 강제할 수 있다.
강제를 함으로써 통일성 및 일관성이 지켜질 수 있으며 결국에는 재사용성 및 유지보수가 향상되고 관리하기도 쉬워진다.
블록([])이 없는 메서드를 포함할 수 있는 클래스이다.
abstract 키워드를 사용하여 다음과 같이 표현된다.
public abstract 리턴타입 메서드명([파라미터]);
추상 클래스의 특징
- 미완성 클래스이다.
- 구성요소는 다음과 같고 반드시 추상 메서드를 포함할 필요는 없다.
- 인스턴스 변수
- 일반 메서드
- 생성자
- 추상 메서드
- 추상 메서드를 포함할 수 있기 때문에 객체생성이 불가능하다. 불완전한 추상 클래스를 사용하기 위해서는 일반 클래스를 이용한다. 상속을 이용하고 다형성 적용도 가능하다. 주의할 점은 하위 클래스에서 반드시 추상 클래스의 추상 메서드를 재정의 해야 된다. 재정의 하지 않으면 컴파일 에러.
- 추상 클래스도 클래스이기 때문에 단일 상속만 지원된다.
- 추상 클래스와 추상 메서드의 UML표기법은 이탤릭체(기울임)로 표현한다.
- 객체 생성은 불가능하지만 선언된 변수의 데이터형으로 사용할 수 있다.
- 강제성 및 통일성을 제공한다. 하위 클래스에게 특정 메서드만 강제할 수 있다.
예제
//AbstractClass
public abstract class AbstractClass {
private int num;
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public AbstractClass() {}
public AbstractClass(int num) {
this.num = num;
}
}
//ConcreteClass
public class ConcreteClass extends AbstractClass{
public ConcreteClass() {
super();
}
public ConcreteClass(int num) {
super(num);
}
}
//TestMain
public class TestMain {
public static void main(String[] args) {
//추상클래스 객체 생성 불가
// AbstractClass ab = new AbstractClass(); //error
ConcreteClass con = new ConcreteClass(100);
System.out.println(con.getNum()); //100
// 상속관계 : 다형성 허용
AbstractClass con2 = new ConcreteClass(200);
System.out.println(con2.getNum()); //200
}
}
❗반드시 추상 클래스를 가져야 되는 것은 아니지만, 추상 메서드를 포함하면 반드시 추상 클래스로 지정해야 된다.
또한 추상 메서드는 반드시 abstract 키워드를 지정해야 된다.
추상 클래스와 비슷한 용도로 인터페이스를 사용할 수 있다.
다음과 같은 인터페이스 키워드를 사용하고 4가지 구성요소를 포함할 수 있다.
public interface 인터페이스명 {
// public static final로 지정한 상수
// public abstract 지정자를 이용한 추상메서드
// public default 지정자를 이용한 일반메서드
// public static 지정자를 이용한 일반메서드
}
- 추상 메서드를 가지고 있기 때문에 객체생성이 불가능하다. 추상 클래스와 마찬가지로 인터페이스를 사용하기 위해서는 일반 클래스를 이용한다. 상속과 비슷한 구현(implement)을 이용하고 다형성 적용도 가능하다. 구현할 때는
implements키워드를 사용한다. 주의함 점은 하위 클래스에서 반드시 인터페이스의 추상 메서드를 재정의 해야된다.
- 다중 구현이 가능하다. 클래스는 단일 상속만 지원되지만 인터페이스는 '다중 구현'을 지원한다. 구현은 '준상속' 관계이기 때문에 계층 구조적으로 인터페이스가 구현 클래스보다 큰 타입이다. 따라서 다형성 적용이 가능하다.
- 인터페이스 간에도 extends 키워드를 이용해서 상속이 가능하며 클래스와 다르게 다중 상속이 된다.
- 객체 생성은 불가능하지만 변수의 데이터 형으로 사용할 수 있다.
- 강제성 및 통일성을 제공한다.
- UML표기법은
<<interface>>으로 표현한다.
⚠️예제는 이클립스 '09Day6' 참고

프로그래밍에서 디커플링이란 '모듈 사이의 연결고리(의존관계)를 인터페이스를 사용하여 두 모듈의 의존성을 감소하여 개발 및 유지보수가 용이하도록 처리하는 방법'을 의미한다.
객체들간에 결속력이 강하면, 그 프로그램의 구성요소중 하나를 수정하게 되면 그와 연관된 모든 구성 요소를 새로 수정해야 된다.
그러나 인터페이스를 이용한 설계가 잘 된 경우에는 수정하고자 하는 요소만 수정하여 재배포 하면 된다.


