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주차에서 배운 것들.. 이해하는데 쉽지 않았다
사실 아직도 능숙하게 쓰진 못하지만 더듬거리면서 쓸 수는 있는 정도
내 블로그는 모든 걸 정리하진 않고 어렵고 헷갈리는 부분만 정리중이다.
너무 길어지면 읽기 힘들고 볼륨만 커지기 때문에..
전의 블로그랑은 다른 느낌으로 정리했는데 좀 괜찮은듯
딱딱하게 정리하기보단 읽기 편하게 음슴체.
다음 이 시간에..
'JAVA' 카테고리의 다른 글
자바 개발자 양성 과정 4주차 - 2 (0) | 2024.08.05 |
---|---|
자바 개발자 양성 과정 4주차[예외] (0) | 2024.08.01 |
자바 개발자 양성과정 2주차 [객체] (2) | 2024.07.15 |
자바 개발자 양성과정 1주차 (1) | 2024.07.07 |
자바 개발자 양성과정반 시작 (0) | 2024.06.30 |