JAVA

자바 개발자 양성과정 3주차 [상속, 다형성, 추상클래스]

J휘 2024. 7. 24. 09:03

3주차 학습  [상속, 다형성, 추상클래스]

 

[상속]

: 클래스의 재사용을 위한 것으로 부모클래스를 상속받아 사용하는 것

장점

1. 적은 양의 코드로 새로운 클래스 작성

2. 코드의 유지보수 용이

3. 중복 코드 제거와 생산성 향상

 

특징

◾ 모든 클래스는 Object 의 자식클래스이다. (최상위 부모 = Object)

◾ 자식 클래스 생성 시, 부모 클래스 생성자가 먼저 실행

자식 클래스 생성자 안에서 부모 클래스 생성자 호출을 명시하고 싶으면 super() 활용

◾ 부모의 private멤버는 상속은 되지만 직접 접근 불가

----------------------------------------------------------------------------------------------------------------

[다형성]

:객체지향 프로그래밍의 3대 특징 중 하나로 ‘여러 개의 형태를 갖는다’라는 뜻

상위 클래스로 하위클래스의 객체를 사용할 수 있음

 

오버라이딩

부모클래스의 메소드를 자식클래스에서 덮어쓸 수 있는데 이를 오버라이딩 이라고 한다

(=부모 클래스의 메소드를 자식 클래스에서 재정의하는 것)

 

◾ 메소드의 이름, 반환 타입, 매개변수 목록이 부모 클래스와 같아야 함

◾ private는 상속되지 않음

더 있긴한데 이정도만 주의하면 될듯

----------------------------------------------------------------------------------------------------------------

[업 & 다운 캐스팅]

1. 업 캐스팅 (Up Casting)

:상속 관계에 있는 부모, 자식 클래스 간의 부모타입의 참조형 변수가 

모든 자식 타입의 객체 주소를 받을 수 있음

 

ex) Car c = new Sonata();      

여기서 Car 객체 c는 사용할 기능을 뜻하고 Sonata실제 메모리의 크기를 의미한다.

간단하게 말해서 Sonata의 모든 기능을 만들어 놓고 Car(기본)의 기능만 사용한다는 것이다.  

 

#주의

여기서 헷갈릴 수 있는 부분이 Car의 기능이 더 작아서 Down 캐스팅이라고 생각할 수 있는데

상속 관계에서 Car이 더 위에 있기 때문에 부모타입으로 만드는 게 "UP" 캐스팅이다

( 상위 클래스로 갈수록 기능은 점점 작아진다. 부모보다 자식이 더 잘 된다고 생각하면 쉬운듯)

 

2. 다운 캐스팅 (Down Casting)

예)

Car c = new Sonata();      // 업캐스팅

( ( Sonata ) c ).moveSonata( ); // 다운 캐스팅

 

정식 설명

: "자식 객체의 주소를 받은 부모 참조형 변수를 가지고 자식의 멤버를 참조해야 할 경우,
부모 클래스 타입의 참조형 변수를 자식 클래스 타입으로 형 변환하는 것."

이 다운 캐스팅의 정의인데 완전히 이해한 상태에선 뭔 소린지 알지만

이해를 못한 상황에서는 이게 뭔 소린가... 하게 된다

 

내 방법으로 설명을 하자면 

아까 업캐스팅 설명할 때 썼던 코드   ex) Car c = new Sonata();   << 이게 업캐스팅한 것.

가장 먼저 다운 캐스팅은 업캐스팅을 한 객체(클래스)에만 사용이 가능하다.

이게 또 뭔 소린가 하면, 완전히 맞는 설명은 아니지만 

업캐스팅 = 폴더 압축이라면 다운 캐스팅은 압축을 푸는 거라고 생각하면 된다,

"압축을 해야 풀지, 압축을 하지도 않았는데 풀긴 뭘 풀어" 같은 느낌..

(예전에 배운 강제 형변환과 같다고 생각하면 ok)

 

#주의

Car c = new Sonata();   이 코드에서 반대로 

XX Sonata s = new Car XX  이건 불가능함 

[사용할 기능] = [만들 기능]     << 이렇게 생각하면 편함

 

아까 말했다시피 자식클래스가 더 많은 기능을 가지고 있다. 그런데 

틀린 예제의 경우 Car의 작은 기능을 만드는데 사용할 기능은 Sonata만큼 크다.

기본 깡통차를 사놓고 더 많은 옵션을 가진 풀옵션 차의 기능을 사용할 수 없는 것과 같음

이정도면 진짜 쉽게 설명한듯.. 굿

 

그리고 가장 중요한 업&다운 캐스팅을 하는 이유는

업캐스팅을 하면 여러 자식 클래스로의 변환과 접근이 가능하기 때문이다(다형성). 코드를 간편하게 작성가능하다능()

 

3. instanceof 연산자

:현재 참조형 변수가 어떤 클래스 형의 객체 주소를 참조하고 있는지 확인 할 때 사용

class B extends A{}    // B는 A를 상속받음

A a = new A();

B b = new B();

 

System.out.print ( a instancsof A )    //true 출력

= a가 A의 기능을 전부 사용할 수 있나? O

 

System.out.print ( b instancsof A )    //true  ( A를 상속받았기 때문 )

= b가 A의 기능을 전부 사용할 수 있나? O

 

System.out.print ( a instancsof B )    //false   

= a가 B의 기능을 전부 사용할 수 있나? X

 

System.out.print ( b instancsof B )    //true

 b가 B의 기능을 전부 사용할 수 있나? O

----------------------------------------------------------------------------------------------------------------

[인터페이스(interface)]

implements으로 상속 받음

인터페이스는 추상메소드만 갖고있다. (static 변수는 가능. 메모리가 다른 곳에 생성되기 때문)

추상메소드란 기능을 갖고 있지 않은 메소드를 말한다.

= 인스턴스 생성불가( 객체생성 X )

그래서 인터페이스는 상속을 받고 해당 클래스에서 재정의해서 기능을 채워서 써야한다(구현).

 

인터페이스는 다중 상속이 가능하다 ( 한 클래스에서 여러개의 인터페이스를 상속받을 수 있단 소리 )

 

1. 모든 인터페이스의 메소드는 묵시적으로 public이고 abstract이다. ( 안 써도 자동으로 됨)

2. 변수는 묵시적으로 public static final (상수.. 변경 불가능)

3. 객체 생성은 안되나 참조형 변수로는 가능

 

[추상 클래스 abstruct Class]

extends으로 상속 받음

추상메소드가 포함된 클래스로 얘도 무조건 상속을 받아서 사용해야 함.(객체 생성 불가)

특이한 점은 클래스 내에 일반 변수, 메소드 포함 가능하다는 점..

객체 생성만 안 될 뿐, 다른 멀쩡한 메소드들을 작성할 수 있다.

단지 추상메소드가 껴있어서 객체생성이 안 되고 상속받아서 해야한다는 것.

상속받으면 추상메소드를 꼭 오버라이딩해서 써야함. 안 쓰면 빨간줄 뜸.

 

인터페이스와 추상클래스 둘 다 객체 생성 X

 

========================================================

여기까지가 3주차에서 배운 것들.. 이해하는데 쉽지 않았다

사실 아직도 능숙하게 쓰진 못하지만 더듬거리면서 쓸 수는 있는 정도

내 블로그는 모든 걸 정리하진 않고 어렵고 헷갈리는 부분만 정리중이다.

 

너무 길어지면 읽기 힘들고 볼륨만 커지기 때문에..

전의 블로그랑은 다른 느낌으로 정리했는데 좀 괜찮은듯 

딱딱하게 정리하기보단 읽기 편하게 음슴체.

다음 이 시간에..