본문 바로가기
Study/Language

[Java] 상속과 인터페이스

by jamiehun 2023. 3. 12.

상속

상속에서는 이미 잘 개발된 클래스를 재사용해서 새로운 클래스를 만듦으로써 중복되는 코드를 줄이고 개발시간을 단축시킨다.

extends를 사용하여 자식이 부모를 선택하며 자식 객체가 생성되면 부모 객체는 먼저 생성된다 (super()가 숨겨져있음)

메소드 오버라이딩을 통하여 자식은 부모가 가지고 있는 메서드를 다르게 사용할 수 있고,

final 키워드를 통해서 상속이 불가능한 클래스나 오버라이딩이 불가능한 메서드를 만들 수 있다.

 

protected 접근 제한자는 default와 public의 중간이라고 할 수 있는데, 같은 패키지이거나 자식 객체만 사용이 가능하다.

(상속에서 사용이 많이 될 것으로 생각되었다.)

 

타입 변환의 경우 

부모타입 변수 = 자식타입객체; 로 이루어진다.

이 개념은 계속 보아도 헷갈렸는데

자식타입 변수 = 부모타입객체; 인지 부모타입 변수 = 자식타입객체; 인지 헷갈리는 측면이 많았다.

Animal animal = new Cat();과 같이 (고양이는 동물)일 수 있지만

Cat cat = new Animal(); 은 될 수 없다는 점(동물은 고양이)을 기억하면 어떨까 싶었다.

위의 경우에는 자식타입 변수 = (자식타입) 부모타입객체; 로 강제타입변환이 필요하다.

 

또한 다형성을 통하여 실행결과를 다양하게 사용할 수 있는데

이런 다형성을 구현하기 위해서는 자동타입변환과 메서드 재정의가 필요하다.

 

객체타입을 확인하기 위해서는 instanceof를 사용하며,

객체 instanceof 타입; 이 주로 사용된다.

 

추상클래스를 통해서 상속할 객체들의 말 그대로 추상적인 클래스들을 만들어 놓는데,

이 추상 클래스는 자기자신이 스스로 객체를 생성하지 못한다.

따라서 상속한 객체들이 추상 클래스의 객체를 생성해야만 한다.

또한 추상 메서드를 통해서 오버라이딩을 강제(?)할 수도 있다. 

 

인터페이스 

인터페이스를 통하여서 다형성을 구현해낼 수 있다.

사실상 인터페이스를 이용하여 다형성을 구현하는 것이 더 많다.

클래스와 선언하는 방법이 비슷하다고 생각할 수 있지만, intellij에서는 클래스와는 다르게 인터페이스를 선언한다.

 

인터페이스를 선언한 후에는 

public class A implements 인터페이스명 { ... } 과 같이 인터페이스를 구현할 객체를 설정한다.

 

여기에서 인터페이스는 하나의 타입이다. 

따라서 인터페이스는 참조 타입에 속하므로 객체를 참조한다고 볼 수 있다.

인터페이스를 통해서 구현객체를 사용하려면 인터페이스 변수에 구현객체를 대입해야한다.

 

메인메서드가 인터페이스를 호출하고 인터페이스가 각 구현객체들을 호출한다고 보면 될 것 같다.

 

인터페이스에 선언된 필드는 모두 public static final 특성을 갖는다.

따라서 필드값은 public static final을 생략하더라도 자동적으로 컴파일 과정에서 붙게 된다. (대문자와 언더바를 사용하는 것이 관례)

public interface RemoteControl{
	int MAX_VOLUME = 10;
    int MIN_VOLUME = 0;
}

 

인터페이스에서 좀 새롭게 여겨졌던 것은 추상메서드인데,

인터페이스에서 리턴타입, 메서드명, 매개변수만 입력하고 중괄호 {}를 붙이지 않더라도 컴파일 과정에서

public abstract가 자동으로 붙게된다. 메서드의 선언부만 작성하고 상속되는 객체에서 메서드를 오버라이딩 할 수 있다는 것이 특징이다.

 

그 외에도 디폴트메서드, 정적메서드(public이 자동으로 붙는 것이 클래스 정적메서드와의 차이), private 메서드 등이 있다.

 

인터페이스는 다중 인터페이스구현을 통해 구현객체가 여러 인터페이스를 대입할 수 있다.

또한 인터페이스에서는 다중상속을 인정한다는 것이 신기하게 보였다.

 

다형성을 구현하는 것과 객체타입 확인은 상속과 비슷하게 느껴졌다.