JaeWon's Devlog
article thumbnail
반응형

- 해당 내용은 백기선 님의 자바 온라인 스터디 공부 및 제출 목적

   -> https://github.com/whiteship/live-study/issues/6

 

6주차 과제: 상속 · Issue #6 · whiteship/live-study

목표 자바의 상속에 대해 학습하세요. 학습할 것 (필수) 자바 상속의 특징 super 키워드 메소드 오버라이딩 다이나믹 메소드 디스패치 (Dynamic Method Dispatch) 추상 클래스 final 키워드 Object 클래스 마

github.com


목표

  • 자바의 상속에 대해 학습하세요.

학습할 것 (필수)

  • 자바 상속의 특징
  • super 키워드
  • 메소드 오버라이딩
  • 다이나믹 메소드 디스패치 (Dynamic Method Dispatch)
  • 추상 클래스
  • final 키워드
  • Object 클래스

1. 자바 상속의 특징

1.1 상속이란?

- 부모클래스의 변수와 메소드를 물려받는 것.

- 상속은 기존의 클래스를 재사용하여 새로운 클래스를 작성.

- 새로운 클래스의 이름 뒤에 상속받고자 하는 클래스의 이름을 'extends'와 함께 작성하여 사용된다.

  • 상속 받는 클래스 = 하위클래스 = 자식클래스 = 서브클래스
  • 상속 해주는 클래스 = 상위클래스 = 부모클래스 = 슈퍼클래스
// 부모클래스(Fruit) 자식클래스(Banana)
class Banana extends Fruit{
	...
}

1.2 자바 상속의 특징

- 다단계 상속이 가능하지만, 다중 상속을 지원하지 않는다.

- 모든 클래스는 Object 클래스의 자식 클래스이다.

- 상속을 통해서 클래스를 작성하면 적은 양의 코드로 새로운 클래스를 작성할 수 있다.

- 코드를 공통적으로 관리하기 코드의 추가 및 변경이 매우 용이하다.

2. super 키워드

- 자식 클래스에서 부모 클래스의 가리키는 키워드.

- 자식 클래스에서 부모 클래스의 생성자나 메소드를 호출.

- 만약, 자식 클캐스의 생성자에서 super()를 명시적으로 사용하지 않으면, 컴파일러가 자동으로 삽입.

- 부모 클래스로부터 상속받은 멤버도 자식 클래스에서도 멤버이므로 this 사용이 가능.

- 부모 클래스와 자식 클래스를 구별하는데 사용되는 점을 제외하고 super 와 this는 근본적으로 같음.

3. 메소드 오버라이딩

3.1 오버라이딩(Overriding)이란?

- 부모클래스로부터 상속받은 메소드의 내용을 변경하여 재사용하는 것.

- 상속받은 메소드를 그대로 사용도 가능하지만, 자식클래스에서 원하는 대로 변경하여 사용하는 경우가 많다.

3.2 오버라이딩 조건

- 자식 클래스에서 오버라이딩하는 메소드는 부모클래스의 메소드와 이름, 매개변수, 반환타입이 같아야 한다.

class Fruit {
    public void sale(){
    	System.out.println("과일을 판다");
    }
}

// 과일(부모클래스)를 상속
class Banana extends Fruit{
    @Override
    public void sale(){
    	System.out.println("과일인 바나나를  판다.");
    }
}

// 과일(부모클래스)를 상속
class Apple extends Fruit{
    @Override
    public void sale(int i){
    	System.out.println("과일인 사과를 " + i + "개 판다."); // 에러(부모클래스에 정의되지 않음)
    }
}

4. 다이나믹 메소드 디스패치 (Dynamic Method Dispatch)

- 메소드 디스패치(Method Dispatch)는 어떤 메소드를 호출할 지 결정하여 실행시키는 과정.

- static(정적) 과 dynamic(동적)이 존재.

  • Static Dispatch
    - 컴파일 시점에서, 컴파일러가 특정 메소드를 호출하도록 명확하게 지정된 경우.
public class A{
     public void print(){
           System.out.println("A");
     }
}

public class B extends A {
     public void print(){
           System.out.println("B");
     }
}

public class StaticDispatch{
      public static void main(String[] args){
             B b = new B();
             b.print();         //B를 출력 
      }
}
  • Dynmaic Dispatch
    - 컴파일러가 어떤 메소드를 호출할지 모르는 경우.
    - 런타임 시점에 결정.
public class A{
     public void print(){
           System.out.println("A");
     }
}

public class B extends A {
     public void print(){
           System.out.println("B");
     }
}

public class C extends A {
     public void print(){
           System.out.println("C");
     }
}

public class StaticDispatch{
      public static void main(String[] args){
             A b = new B();
             A c = new C();
             b.print();		//B를 출력
             c.print();		//C를 출력
      }
}

5. 추상 클래스

- 클래스를 만들기 위한 일종의 미완성 설계도로 인스턴스를 생성할 수 없는 클래스.

- 추상클래스를 사용하기 위해서는 상속을 통해서 자식클래스에 구현하여 완성된다.

- 추상클래스는 'abstract' 키워드를 클래스 선언부에 작성하여 사용.

abstract class Fruit{
	...
}

- 추상클래스는 반드시 하나 이상의 추상메소드를 포함하며, 생성자와 멤버변수, 일반메소드를 가질 수 있다.

6. final 키워드

- final 키워드는 '변경될 수 없다'의 의미를 가지며, 거의 모든 대상에 사용 가능.

제어자 대 상 의 미
final 클래스 변경될 수 없는 클래스, 확장될 수 없는 클래스가 된다.
따라서 final로 지정된 클래스는 다른 클래스의 조상이 될 수 없다.
메서드 변경될 수 없는 메서드, final로 지정된 메서드는 오버라이딩을 통해 재정의 될 수 없다.
멤버변수 변수 앞에 final이 붙으면, 값을 변경할 수 없는 상수가 된다.
지역변수
final class keywordFinal {           // 부모가 될 수 없는 클래스
        final String JAVS_ONLINE_STUDY = "상속";        
        // 값을 변경할 수 없는 멤버변수(상수)

        final void method() {       // 오버라이딩할 수 없는 메소드(변경불가)
            final String finalString = JAVS_ONLINE_STUDY;    
            // 값을 변경할 수 없는 지역변수(상수)
            
            return finalString;
        }
    }

7. Object 키워드

- Java에서 모든 클래스들의 부모 클래스.

- 개발자가 만드는 클래스도 Object 클래스를 무조건 상속 받는다.

- toString(), eqauls() 등 여러 메소드를 따로 정의하지 않아도 사용이 가능했던 것은 해당 메소드들이 Object 클래스에 정의되고 이를 상속받았기 때문이다.

Object클래스의 메서드 설 명
protected Object clone(   ) 객체 자신의 복사본을 반환한다.
public boolean equals(Object obj) 객체 자신과 객체 obj가 같은 객체인지 알려준다.(같으면 true)
protected void finalize() 객체가 소멸될 때 가비지 컬렉터에 의해 자동적으로 호출된다.
이 때 수행되어야하는 코드가 있을 때 오버라이딩한다.(거의 사용되지 않음)
public Class getClass() 객체 자신의 클래스 정보를 담고 있는 Class인스턴스를 반환한다.
public int hashCode() 객체 자신의 해시코드를 반환한다.
public String toString() 객체 자신의 정보를 문자열로 반환한다.
public void notify() 객체 자신을 사용하려고 기다리는 쓰레드를 하나만 깨운다.
public void notifyAll() 객체 자신을 사용하려고 기다리는 모든 쓰레드를 깨운다.
public void wait()
public void wait(long timeout)
public void wait(long timeout, int nanos)
다른 쓰레드가 notify()나 notifyAll()을 호출할 때까지 현재 쓰레드를 무한히 또는 지정된
시간(timeout, nanos)동안 기다리게 한다. (timeout은 천 분의 1초, nanos는 109분의 1초)

참고

- https://hoooooooooooooop.tistory.com/entry/javahalle6

- https://blog.naver.com/swoh1227/222181505425

- https://yadon079.github.io/2020/java%20study%20halle/week-06

반응형

'Study > Java(Online-Study)' 카테고리의 다른 글

8주차 과제: 인터페이스  (0) 2021.07.19
7주차 과제 : 패키지  (0) 2021.07.19
5주차 과제: 클래스 - 이론(1)  (0) 2021.06.27
4주차 과제: 제어문 - 이론(1)  (0) 2021.06.20
3주차 과제 : 연산자  (0) 2021.06.19
profile

JaeWon's Devlog

@Wonol

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!