상속

[Java] 상속에 대해 공부하고 재정의, 다형성, 오버라이딩(무효화), 동적바인딩에 대해 알아본다.
Dec 22, 2023
상속

상속

상속은 기존에 존재하는 클래스로부터 필드와 메소드를 이어받고, 필요한 기능을 추가할 수 있는 기법이다.
is 관계여야 상속이 가능, has 관계는 상속 불가능
ex) 자동차 has 엔진, 자동차 is 탈 것. (엔진 상속 불가, 탈 것 상속 가능)
 
class Animal{ int age; void eat(){ System.out.println("먹고 있음..."); } } class Dog extends Animal{ // extends 를 써서 Animal class에 상속됨. void bark(){ System.out.println("짖고 있음..."); } } public class DogTest { public static void main(String[] args) { Dog d = new Dog(); d.bark(); //d 는 두가지 기능을 다 수행함 d.eat(); }

재정의

부모 클래스와 자식 클래스가 같은 메소드를 가지고 있으면 자식 클래스가 부모 클래스의 메소드를 재정의 하는 것임.
 

다형성

공무원 클래스가 있고, 검사, 판사, 경찰 클래스가 상속해있을때 new로 할때 공무원타입을 써도됨.
class 공무원{ } class 판사 extends 공무원{ } class 검사 extends 공무원{ } class 경찰 extends 공무원{ } public class 재판{ public static void main(String[] args){ 판사 판사1 = new 판사(); 검사 검사1 = new 검사(); // 위 두개는 일반적으로 new 한 것. 공무원 경찰1 = new 경찰(); // 경찰이 들어갈 자리에 공무원을 넣은것 -> 다형성 } }
 

무효화

재정의 함으로써 부모 클래스의 메소드는 무효화 된다.
 

동적바인딩

재정의한 자식 클래스의 메소드를 실행하는 것.
 

그림으로 이해

notion image
추상화
abstract class 판사{ // abstract(추상) class는 Object가 아님 -> new 할 수 없다. public abstract void 심문(); } abstract class 증인{ // 독립적으로 뜨는 방법은 없다. 상속을 해서 뛰어야만 뜰 수 있다. public abstract void 대답(); } class 왕 extends 판사{ public void 심문(){ System.out.println("왕은 심문한다."); } } class 왕비 extends 판사{ public void 심문(){ System.out.println("왕비는 심문한다."); } } class 모자장수 extends 증인{ public void 대답(){ System.out.println("모자장수는 대답한다."); } } class 토끼 extends 증인{ public void 대답(){ System.out.println("토끼는 대답한다."); } } class 엘리스 extends 증인{ // 엘리스에 커서 올리고 Alt+Enter 하면 바로 만들어짐. @Override public void 대답() { // 새로 만들 때 오타같은 것을 허용 x System.out.println("엘리스는 대답한다."); } } public class AliceApp { public static void main(String[] args) { 판사 u1 = new 왕비(); // [판사, 왕비] 증인 u2 = new 엘리스(); // [증인, 토끼] u1.심문(); u2.대답(); } }
 

instanceof 연산자

사용
class Protoss{ // 바뀜 } class Zealot extends Protoss{ public void attack(){ System.out.println("질럿이 공격합니다."); } } class Dragoon extends Protoss { public void attack() { System.out.println("드라군이 공격합니다."); } }
public class CastingEx01 { public static void start(Protoss p){ // 바뀜 if(p instanceof Zealot){ // 타입을 확인하는것 p가 Zealot 타입 이라면 Zealot u = (Zealot) p; u.attack(); } if(p instanceof Dragoon){ Dragoon u = (Dragoon) p; u.attack(); } // Zealot z = p; 부모를 자식에게 대입할 수 없다. } public static void main(String[] args) { start(new Zealot()); start(new Dragoon()); } }
미사용
abstract class Protoss{ public abstract void attack(); } class Zealot extends Protoss{ public void attack(){ System.out.println("질럿이 공격합니다."); } } class Dragoon extends Protoss { public void attack() { System.out.println("드라군이 공격합니다."); } }
public class CastingEx01 { public static void start(Zealot u){ u.attack(); } public static void start(Dragoon u){ u.attack(); } public static void main(String[] args) { start(new Zealot()); start(new Dragoon()); } }

요약

  • 상속(inheritance)은 기존에 존재하는 클래스로부터 필드와 메소드를 이어받고, 필요한 기능을 추가할 수 있는 기법이다.
  • 상속을 이용하면 여러 클래스에 공통적인 코드들을 하나의 클래스로 모을 수 있어서 코드의 중복을 줄일 수 있다.
  • 자바에서는 extends 키워드를 이용하여 상속을 나타낸다. 상속하는 클래스를 부모 클래스(슈퍼 클래스)라고 하고 상속받는 클래스를 자식 클래스(서브 클래스)라고 한다.
  • 자식 클래스는 부모 클래스의 public 멤버, protected 멤버, 디폴트 멤버(부모 클래스와 자식클래스 같은 패키지에 있다면)를 상속 받는다.
  • (부모 클래스의 생성자) —>(자식 클래스의 생성자) 순으로 호출된다.
  • 메소드 오버라이딩(method overriding)은 자식 클래스가 부모 클래스의 메소드를 자신의 필요에 맞추어서 재정의하는 것이다.
  • 오버로딩(overloading)이란 같은 메소드명을 가진 여러 개의 메소드를 작성하는 것이다. 오버라이딩(overriding)은 부모 클래스의 메소드를 자식 클래스가 다시 정의하는 것을 의미한다.
  • 부모 클래스 변수로 자식 클래스 객체를 참조할 수 있다. 이것을 업캐스팅이라고 한다.
  • 추상 클래스(abstract class)는 완전하게 구현되어 있지 않은 메소드를 가지고 있는 클래스를 의미한다.
  • 추상 메소드로만 이루어진 클래스를 인터페이스라고 한다. 인터페이스는 다른 클래스에 의하여 구현(implement)될 수 있다. 인터페이스를 구현한다는 말은 인터페이스에 정의된 추상 메소드의 몸체를 정의한다는 의미이다.
  • 구성은 클래스가 다른 클래스의 인스턴스를 클래스의 필드로 가지는 디자인 기법이다. 반면에 상속은 한 객체가 클래스를 상속받아서 부모 객체의 속성과 동작을 획득할 수 있는 기법이다. 구성 및 상속은 모두 클래스를 연결하여 코드 재사용성을 제공한다.
Share article
RSSPowered by inblog