Development Project

Chapter05 상속 본문

Language/Java

Chapter05 상속

나를 위한 시간 2021. 12. 27. 20:41
  1. 상속
    - 부모클래스(상위클래스)에 만들어진 필드, 메소드를 자식클래스(하위클래스)가 물려받음
    • 장점
      1. 클래스의 간결화
        - 멤버의 중복 작성 불필요
      2. 클래스 관리 용이
        - 클래스들의 계층적 분류
      3. 소프트웨어의 생산성 향상
        - 클래스 재사용과 확장 용이
        - 새로운 클래스의 작성 속도 빠름
  2. 클래스 상속과 객체
    • 클래스 상속
      public class Person {
      	...
      }
      
      // Person을 상속받는 클래스 Student 선언
      public class Student extends Person {
      	...
      }
      
      // Student를 상속받는 StudentWorker 선언
      public class StudentWorker extends Student {
      	...
      }​
      - 부모클래스(슈퍼클래스)
      - 자식클래스(서브클래스) == 슈퍼클래스를 확장

    • 객체
      public class Main {
      	public static void main(String[] args) {
          	Point p = new Point();	
              p.set(1, 2);
              p.showPoint();
              
              ColorPoint cp = new ColorPoint();
              cp.set(3, 4);
              cp.setColor("red");
              cp.showColorPoint();
          }
      }
      
      public class Point {
      	int x;
      	int y;
          
      	void set(int x, int y){
          	this.x = x;
              this.y = y;
          }
      }
      
      public class ColorPoint extends Point {
      	String color;
      
      	void setColor(String color){
      		this.color = color;
      	}
          
      	void showColorPoint() {
      		System.out.print(color);
      		showPoint();
      	}
      }


    • 자바 상속의 특징
      - 클래스의 다중 상속을 지원하지 않음
      - 상속 횟수는 무제한
  3. 상속과 protected 접근 지정자
  4. 상속과 생성자
    • 서브 클래스 / 슈퍼 클래스의 생성자 호출 및 실행
      • new에 의해 서브 클래스의 객체가 생성될 때
        - 슈퍼 클래스의 생성자와 서브 클래스 생성자 모두 실행됨
        - 생성자 호출은 서브 클래스의 생성자를 먼저 호출 후, 컴파일러가 슈퍼 클래스의 생성자를 호출
        - 생성자 실행은 슈퍼 클래스의 생성자가 먼저 실행된 후, 서브 클래스의 생성자 실행
        • 슈퍼 클래스와 서브 클래스의 생성자간의 호출 및 실행 관계
      • 슈퍼 클래스 생성자와 서브 클래스 생성자
        1. 슈퍼 클래스의 기본 생성자가 자동 선택
          => 만약 클래스 A에 기본 생성자가 없다면, 컴파일러에 의해 “Implicit super constructor A() is undefined. Must explicitly invoke another constructor” 오류가 발생함
        2. 서브 클래스에 매개변수를 가진 생성자
    • super( parameter );
      - 서브 클래스에서 명시적으로 슈퍼 클래스의 생성자 선택 호출할 때 사용
      - 반드시 서브 클래스 생성자 코드의 가장 첫번째 줄에 위치해야함
      - 슈퍼 클래스의 생성자 중 parameter를 받을 수 있는 생성자가 호출됨
  5. 업캐스팅(upcasting)과 instanceof 연산자
    • 업캐스팅 (upcasting) : 자동타입변환 
      - 서브 클래스 객체를 슈퍼 클래스 타입으로 타입 변환
      class Person { ... }
      class Student extneds Person { ... }
      
      Student s = new Student();
      Person p = s;	// Upcasting : 객체 내에 슈퍼 클래스의 멤버만 접근 가능
    • 다운캐스팅 (downcasting) : 강제타입변환
      - 슈퍼 클래스 객체를 서브 클래스 타입으로 변환
      class Person { ... }
      class Student extneds Person { ... }
      
      Person p = new Student("초코칩");	// Upcasting
      Student s = (Student)p;		// Downcasting

      • if) 실제 객체가 할당되지 않았다면 실행오류가 발생함
        package inheritance.typecast;
        
        public class DownCasting {
        	public static void main(String[] args){
            	Person she = new Person("초코칩", 1234568);
                System.out.println(she.name+" "+she.number);
                // Faculty f = she;			// 컴파일 오류
                // Faculty f1 = (Faculty) she;		// 실행 오류
            }
        }​
    • instanceof 연산자
      - 업캐스팅된 레퍼런스로 객체 타입을 판단할 수 없으므로, 레퍼런스가 가리키는 객체의 타입 식별을 위해 사용
      객체레퍼런스 instanceof 클래스타입	// 결과 : true or false​
  6. 메소드 오버라이딩 (Method Overriding) : @Override
    • 메소드 오버라이딩
      - 슈퍼 클래스의 메소드를 서브 클래스에서 재정의 (메소드이름, 매개변수 타입 및 개수, 리턴 타입 등 동일)
      - ex) 같은 draw( ) 메소드라도 Line클래스는 선을 그리고, Circle클래스는 원을 그리고 싶을 때
      - 동적 바인딩이 발생 : 서브 클래스에 오버라이딩된 메소드가 무조건 실행되는 동적 바인딩
      • Binding : 함수를 호출할 때, 함수가 위치한 메모리 번지로 연결시키는 것
        1. 정적 바인딩 : 컴파일 시간에 호출될 함수로 이동할 수 있는 주소가 결정되어 바인딩 ex) super( ) 사용시
        2. 동적 바인딩 : 점프할 주소를 저장하기 위한 메모리 공간을 가지고 있다가 런타임시 결정

    • 메소드 오버라이딩 vs 오버로드
  7. 추상 클래스
    • 추상 메소드 ( abstract로 선언 )
      - 선언되어 있으나, 구현되어있지 않은 메소드
      public abstract String getName();
      public abstract void setName(String s);​
      - 추상 메소드는 서브 클래스에서 오버라이딩하여 구현해야 함

    • 추상 클래스
      • 개념
        - 추상의 의미대로 "구체적"이지 않은 클래스 즉, 보다 구체적인 하위 클래스를 대표하는 클래스
         
      • 사용 이유
        - 서브 클래스마다 다른 구현이 필요한 메소드는 추상 메소드로 선언하고 슈퍼 클래스에서 개념을 정의함
        - 각 서브 클래스에서 구체적 행위를 구현하기 위해, 서브 클래스 목적에 맞게 추상메소드도 다르게 구현함
        - 계층적 상속 관계를 갖는 클래스 구조를 만들 때

      • 생성 방법 
        1. 추상 메소드를 하나라도 가진 클래스 (abstract 클래스로 선언 필수!)
          abstract class Shape {
          	public Shape() { }
              public void paint() { draw(); }
              abstract public void draw();	// 추상 메소드
          }
        2. 추상 메소드가 없더라도 abstract로 선언된 클래스
          abstract class MyComponent {
          	String name;
              public void load(String name) {
              	this.name = name;
          	}
          }
      • 추상 클래스의 상속
        1. 단순 상속
          - 추상 클래스를 상속받고 추상 메소드를 구현하지 않으면 추상클래스가 됨
          - 서브 클래스도 abstract로 선언해야함
        2. 구현 상속
          - 서브 클래스에서 슈퍼 클래스의 추상 메소드 구현(오버라이딩)
          - 서브 클래스 != 추상 클래스 
      • 다른 일반 클래스와 구별되는 특징
        1. 직접 객체화(instantiation)될 수 없음 == 생성자를 사용하여 객체를 생성할 수 없음
        2. 다른 클래스에 의하여 상속되어야 함 == 하위클래스가 없는 추상클래스는 의미가 없음
        3. 하위 클래스가 존재해야 하므로, 추상 클래스 구현 시 클래스 앞에 final 사용할 수 없음  
  8. 인터페이스
    • 인터페이스란?
      - 스펙을 주어 클래스들이 그 기능을 서로 다르게 구현할 수 있도록 하는 클래스의 규격 선언
      - 클래스의 다형성을 실현하는 도구
      ex) 회사마다 구현방식은 다르지만 전기기기는 표준전압인 220V에 맞게 설계되어야 함

    • 인터페이스 구현 예시
      interface PhoneInterface {
          public static final int TIMEOUT = 10000;
          public abstract void sendCall();
          public abstract void receiveCall();
          public default void printLogo() {
          	System.out.println("** PHONE **");
          };	// 디폴트 메소드
      }
      
      class SamsungPhone implements PhoneInterface {
          @Override
          public void sendCall() {
          	System.out.println("띠리리리링");
          }
          
          @Override
          public void receiveCall() {
          	System.out.println("전화가 왔습니다");
          }
          
          // 메소드 추가 작성 가능
          public void flash() { 
          	System.out.println("전화기에 불이 켜졌습니다.");
          }
      }
      
      public class InterfaceEx {
      	public static void main(String[] args){
          	SamsungPhone phone = new SamsungPhone();
              phone.printLogo();
              phone.sendCall();
              phone.receiveCall();
              phone.flash();
          }
      }
      => interface(PhoneInterface)를 선언하고, 새 클래스에서 PhoneInterface를 implements 키워드를 이용해 인터페이스의 추상 메소드를 모두 구현한 메소드를 작성할 수 있음 (메소드 추가 작성 가능)

    • 자바 인터페이스 특징
      • 인터페이스의 객체 생성 불가
        new PhoneInterface(); 	// 오류​
      • 인터페이스 타입의 레퍼런스 변수 선언 가능
        PhoneInterface galaxy;​
      • 인터페이스를 상속받는 클래스는 인터페이스 내의 모든 추상 메소드를 반드시 구현해야함
      • 다른 인터페이스 상속 가능 
      • 인터페이스의 다중 상속 가능
      • 클래스는 하나 이상의 인터페이스를 구현할 수 있음
        class AIPhone implements MobilePhoneInterface, AIInterface {
            // MobilePhoneInterface의 모든 메소드를 구현
            public void sendCall() { ... }
            public void receiveCall() { ... }
            public void sendSMS() { ... }
            public void receiveSMS() { ... }
            
            // AIInterface의 모든 메소드를 구현
            public void recognizeSpeech() { ... }
            public void synthesizeSpeech() { ... }
        }
  9. 추가) 추상클래스 vs 인터페이스
    • 유사점
      - 객체를 생성할 수 없고, 상속을 위한 슈퍼 클래스로만 사용가능

    • 다른점

 

 

 

 

Comments