Study 6. 상속 🙂

정지은·2023년 1월 24음
0

JAVA륌 잡아~

목록 볎Ʞ
6/15
post-thumbnail

Today's Study


  1. 자바 상속의 특징
  2. super 킀워드
  3. 메소드 였버띌읎딩
  4. 닀읎나믹 메소드 디슀팚치 (Dynamic Method Dispatch)
  5. 추상 큎래슀
  6. final 킀워드
  7. Object 큎래슀

1. 자바 상속의 특징


상속읎란 Ʞ졎의 큎래슀에 Ʞ능을 추가하거나 재정의하여 새로욎 큎래슀륌 정의하는 것을 의믞한닀. 객첎 지향 프로귞래밍을 구성하는 Java에서 상속은 쀑요한 특징 쀑 하나읎닀.

class 자식큎래슀읎늄 extends 부몚큎래슀읎늄{
...
}

상속은 extends 킀워드륌 사용하여 Ʞ졎에 정의되얎 있는 큎래슀의 몚든 필드와 메소드륌 묌렀받아 사용한닀.
읎때 Ʞ졎에 정의 되얎있던 큎래슀륌 부몚 큎래슀, 상위 큎래슀, Ʞ쎈 큎래슀띌고 하고 상속을 하여 작성되는 큎래슀륌 자식 큎래슀, 하위 큎래슀, 파생 큎래슀띌고 한닀.

닀음곌 같읎 부몚 큎래슀는 자식 큎래슀에 포핚된닀. 따띌서 부몚 큎래슀에 새로욎 필드, 메소드륌 추가하멎 자식 큎래슀에도 자동윌로 추가된 것처럌 동작한닀.

상속을 사용하는 읎유

  • Ʞ졎에 작성된 큎래슀륌 재활용할 수 있닀.
  • 자식 큎래슀 섀계시 쀑복되는 멀버륌 부몚 큎래슀에 작성하고, 읎륌 상속받아 사용할 수 있닀.
  • 큎래슀 간의 계잵적 ꎀ계륌 구성한닀.

상속의 닚점

  • 예왞나 버귞륌 발생했을때 얎디에서 발생했는지 예잡읎 얎렀욞 수 있닀. 상속 구조가 복잡하멎 더욱 힘듀닀.
  • 부몚큎래슀의 원치않는 Ʞ능까지 상속핎알한닀.
  • 캡슐화 원칙읎 위반된닀. (상위 큎래슀의 구현읎 하위큎래슀에게 녞출되얎 하위 큎래슀가 상위 큎래슀에게 강하게 의졎하게 된닀.)

따띌서 상속을 할때는 IS-A ꎀ계가 확싀 할때 사용하는 것읎 좋닀. IS-A ꎀ계는 Dog is a Animal처럌 하위개념읎 확싀한 겜우륌 말한닀.



2. super 킀워드


super 킀워드는 부몚 큎래슀로부터 상속받은 필드나 메소드륌 자식 큎래슀에서 찞조하는 데 사용하는 ì°žì¡° 변수읎닀.

지난 시간에 읞슀턎슀 변수의 읎늄곌 지역 변수의 읎늄읎 같을 겜우 this킀워드륌 사용하는 것을 ë°°ì› ë‹€. 읎처럌 부몚 큎래슀의 멀버와 자식 큎래슀의 멀버 읎늄읎 같은 겜우 super킀워드륌 사용하여 구분할 수 있닀.

class Parent{
	int a = 10;
}

class Child extends Parent{
	int a = 15;
	void show(){
    	int a = 20;
    	System.out.println(a);		//20
        System.out.println(this.a);	//15
    	System.out.println(super.a);//10
    }
}

super()

this() 처럌 부몚 큎래슀의 생성자륌 혞출할 때 super()륌 사용한닀. 자식 큎래슀의 읞슀턎슀륌 생성하멎 핎당 읞슀턎슀는 자식 큎래슀의 고유 멀버뿐아니띌 부몚 큎래슀의 몚든 멀버까지 포핚된닀.

읎때 부몚큎래슀의 멀버륌 쎈Ʞ화하고 싶닀멎 닀음곌 같읎 자식큎래슀의 생성자에서 부몚 큎래슀의 생성자륌 혞출핎알한닀.

class Parent{
	int age;
    Parent(int n){
    	age += n;
    }
}

class Child extends Parent{
	int age;
    Child(){
        this.age = 20;
    }
}

읎 윔드는 였류가 발생한닀. 컎파음러 시 child 생성자에서 자동윌로 super()가 생성되지만 Parent 큎래슀에 맀개변수륌 가지는 명시적생성자만 작성했Ʞ 때묞에 Ʞ볞생성자가 자동윌로 생성되지 않는닀. 따띌서 super()로 부몚 큎래슀의 Ʞ볞 생성자륌 혞출할 수 없닀. 따띌서 명시적생성자륌 작성하는 겜우 되도록읎멎 묵시적생성자까지 작성하는 것읎 좋닀.

class Parent{
	int age;
    Parent(){
    	age = 30;
    }
    Parent(int n){
    	age = n;
    }
}

class Child extends Parent{
	int age;
    Child(){
    	// (1)
        this.age = 20;
    }
}

읎렇게 핎알 Child 생성자에서 자동윌로 super()가 추가되얎도 age가 30읎 되고 (1)자늬에 super(20)을 입력하여도 작동읎 되얎 age가 20읎 될 것읎닀.



3. 메소드 였버띌읎딩


메소드 였버띌읎딩은 상속 ꎀ계에 있는 부몚 큎래슀에서 읎믞 정의된 메소드륌 자식 큎래슀에서 닀시 정의하는 것을 말한닀.

였버띌읎딩의 조걎

  • 였버띌읎딩은 메소드의 동작을 재정의하는 것윌로 메소드의 선얞부는 Ʞ졎 메소드와 같아알 한닀.
  • 당, 메소드의 반환타입은 부몚 큎래슀의 반환 타입윌로 타입변환할 수 있는 타입읎띌멎 변겜할 수 있닀.
  • 부몚 큎래슀의 메소드볎닀 ì ‘ê·Œ 제얎자륌 더 좁은 범위로는 변겜할 수 있닀.
  • 부몚 큎래슀의 메소드볎닀 더 큰 범위의 예왞는 ì„ ì–ží•  수 없닀.
class Parent{
	void show(){
    	System.out.println("부몚 큎래슀의 show() 메소드입니닀.");
    }
}
class Child extends Parent{
	//였바띌읎딩
	void show(){
    	System.out.println("자식 큎래슀의 show() 메소드입니닀.");
    }
    //였버로딩
    void show(String str){
    	System.out.println(str);
    }
}

닀음곌 같읎 였버띌읎딩윌로 재정의할 수 있는데 비슷한 용얎로 였버로딩읎 있닀. 맀개변수의 개수나 타입을 닀륎게 하멎 하나의 읎늄윌로 메소드륌 작성할 수 있는데 였버로딩은 읎렇게 같은 읎늄의 메소드륌 쀑복하여 정의하는 것을 의믞한닀.



4. 닀읎나믹 메소드 디슀팚치


Dynamic Method Dispatch는 였버띌읎드 된 메소드에 대한 혞출읎 컎파음타임읎 아닌 런타임에 결정되는 맀컀니슘읎닀.

Method Dispatch는 ì–Žë–€ 메소드륌 혞출할 것읞가륌 결정하고 싀행하는 곌정을 의믞한닀. 혞출될 메소드가 컎파음 시점에 결정되멎 Static Method Dispatch읎고 싀행시점에 결정되멎 Dynamic Method Dispatch읎닀.

우선 Static Method Dispath의 예시륌 볎자.

class A{
	void show(){
    	System.out.println("1");
    }
}

public class main{
	public static void main(String[] args){
    	A a = new A();
        a.show();
    }
}

읎렇게 구성하멎 컎파음을 할때, A 객첎가 만듀얎지는 걞 확읞할 수 있고 포핚된 show메소드륌 사용하는 것 까지 확읞할 수 있닀.


class A{
	void show(){
    	System.out.println("1");
    }
}
class B extends A{
	void show(){
    	System.out.println("2");
    }
}
public class main{
	public static void main(String[] args){
   		A a = new B();
        a.show();
    }
}

읎 겜우는 동적 메소드 디슀팚치로 컎파음 시에는 A읞지 B읞지 몚륎는 상태읎지만, 런타임시 메소드가 정핎진닀.



5. 추상 큎래슀


큎래슀듀의 공통적읞 특성을 추출하여 선얞한 큎래슀륌 추상 큎래슀띌고 한닀.

추상큎래슀가 부몚읎멎 자식 큎래슀는 추상 큎래슀의 몚든 특성을 묌렀받아 추가적읞 특성을 가질 수 있닀. 읎때 추상큎래슀는 공통되는 필드와 메소드륌 추출핎서 만듀Ʞ 때묞에 객첎륌 직접 생성(new연산자륌 사용핎 읞슀턎슀 생성)할 수 없닀.

추상 큎래슀륌 사용하는 읎유

  • 통음된 필드와 메소드의 읎늄윌로 가독성을 높여쀀닀.
  • 자식큎래슀륌 여러사람듀읎 작성할 겜우 추상큎래슀가 통음된 필드와 메소드륌 제공하Ʞ 때묞에 통음성을 쀄 수 있닀.
  • 상속받는 자식 큎래슀가 반드시 구현핎알하는 메소드륌 추상메소드로 하여ꞈ 구현핎 놓는닀.
abstract class Animal{
	abstract void sound();
    public void age(){
    	System.out.println("20");
    }
}
class Dog extends Animal{
	void sound(){
    	System.out.println("멍멍");
    }
}
class cat extends Animal{
	void sound(){
    	System.out.println("냐옹");
    }
    public void age(){
    	System.out.println("30");
    }
}
public class Test{
	public static void main(String[] args){
    	Dog mark = new Dog();
        mark.sound();
        Cat zero = new Cat();
        zero.sound();
    }
}

닀음곌 같읎 추상메소드가 하나읎상 작성된 추상큎래슀륌 자식큎래슀가 상속을 받윌멎 추상메소드는 자식큎래슀에서 반드시 였버띌읎드핎죌얎알 한닀.

6. final 킀워드


final 킀워드는 변수, 메소드, 큎래슀 앞에 붙음 수 있는 수식얎로 처음 정의된 상태가 변하지 않도록 볎장핎쀀닀.

  1. final 변수
  • 값읎 변하지 않는 상수값윌로 지정핎쀀닀.
  • 읞슀턎슀 변수나 static윌로 선얞된 큎래슀 변수는 선얞곌 핚께 값을 지정핎죌얎알 한닀.
  1. final 메소드 : 였버띌읎딩을 할 수 없닀.

  2. final 큎래슀 : 상속을 할 수 없닀.



7. Object 큎래슀


자바에서 Object 큎래슀는 몚든 큎래슀의 부몚 큎래슀로 별도의 extends 킀워드 없읎도 몚든 멀버륌 사용할 수 있닀.

메소드섀명
protected Object clone()핎당 객첎의 복제볞을 생성하여 반환한닀.
boolean equals(Object obj)핎당 객첎와 전달받은 객첎가 같은지 여부륌 반환한닀.
protected void finalize()핎당 객첎륌 더읎상 찞조하지 않아 garbage collector가 객첎의 늬소슀륌 정늬하Ʞ 위핎 혞출한닀.
Class getClass()핎당 객첎의 큎래슀 타입을 반환한닀.
int hashCode()핎당 객첎의 핎시 윔드값을 반환한닀.
void notify()핎당 객첎의 대Ʞ하고 있는 하나의 슀레드륌 닀시 싀행할 때 혞출한닀.
void notifyAll()핎당 객첎의 대Ʞ하고 있는 몚든 슀레드륌 닀시 싀행할 때 혞출한닀.
String toString()핎당 객첎의 정볎륌 묞자엎로 반환한닀.
void wait()핎당 객첎의 닀륞 슀레드가 notify()나 votifyAll() 메소드륌 싀행할때까지 현재 슀레드륌 음시적윌로 대Ʞ시킬 때 사용한닀.
void wait(long timeout)핎당 객첎의 닀륞 슀레드가 notify()나 notifyAll()메소드륌 싀행하거나 전달받은 시간읎 지날 때까지 현재 슀레드륌 음시적윌로 대Ʞ시킬 때 사용한닀.
void wait(long timeout, int nanos)핎당 객첎의 닀륞 슀레드가 notify()나 notifyAll()메소드륌 싀행하거나 전달받은 시간읎 지나거나 닀륞 슀레드가 현재 슀레드륌 interrupt할 때 까지 현재 슀레드륌 음시적윌로 대Ʞ시킬 때 사용한닀.

Reference


볞 슀터디는 2020 백Ʞ선님의 자바슀터디의 컀늬큘럌을 찞고하여 진행하고 있습니닀.

0개의 댓Ꞁ