백엔드개발/Java

[JAVA] 멘토씨리즈 자바 Chapter7

aaahyunseo 2024. 10. 12. 03:15

*오늘의 학습 목표*

상속과 다형성에 대해

각각 90%이상 이해하고 활용해보기

 


(1)상속이란?

새로운 클래스를 작성할 때 기존에 존재하는 클래스를

물려받아 이용하는 것.

멤버를 물려주는 클래스 = 부모 클래스 or 조상 클래스

상속받는 클래스 = 자식 클래스 or 자손 클래스

상속할 때는 새롭게 작성할 클래스 선언 뒤에

extends 부모 클래스 이름

을 붙임.

class Parents{}

class Child extends Parents{}

//Parents 클래스의 멤버들을 상속받음

상속을 사용하는 이유는

코드의 재사용성과 중복성을 줄이기 위함

※상속 시 생성자는 상속되지 않음.

Test05_01.java

Test05_01.java(2)

Test05_01.java(3)

tip)class의 이름은 기본적으로 첫글자 대문자

자바에서는 단일 상속만 허용(2개 이상 상속×)

클래스 앞에 final이 붙은 경우 상속×


(2)오버라이딩

: 자손 클래스에서 상속받은 부모 클래스의 메서드를 수정하는 것

tip)이클립스 사용 시 오버라이딩 할 때

메뉴에서 [source]-[Override/Implement Methods]을 클릭한 후

오버라이딩할 메서드를 선택하면 자동으로 재정의할 메서드 추가.

Test05_02.java

Test05_02.java(2)

※작업창이 다른 클래스여도(예를 들어 Test05_01.java, Test05_02.java)

같은 패키지 안에서 메서드 이름이 겹치면 서로 상호작용됨.

(가장 첫번째 생성된 클래스를 가장 상위 클래스로 인식해 찾아감)

참조변수 this, super (p.114)

this : 인스턴스들이 메서드를 호출할 때, 메서드는 공용으로 사용하게 되는데

(위에 ※에서 한 말과 동일), 이때 각 인스턴스의 정보를 저장하는 변수

this() : 클래스에서 생성자의 임무가 겹칠 때, 한 생성자로 임무를 집중시킬 수 있음.

((사실 이건 아직 무슨 소린지 이해 안됨))

super : 상속에서 자식 멤버와 이름이 겹칠 때 super.변수, super.메서드()를

사용하면 자식의 멤버가 아닌 부모의 멤버 호출 가능

super() : 자식 생성자에서 부모 생성자를 호출할 때 사용


(3)상속과 생성자

자식 클래스 생성자 작업 시

반드시 부모 클래스 생성자도 호출해줘야 함

부모 클래스 호출은 무조건

자식 클래스 생성자 첫 줄에서 이루어짐

super();

Test05_03.java

Test05_03.java(2)

++++++++++

Object 클래스

: 모든 클래스의 조상인 클래스

어떤 클래스라도 상속 관계를 따라 거슬러 올라가면

항상 마지막에는 Object 클래스가 있음

모든 클래스는 Object 클래스를 자동으로 상속하기 때문에

Object 클래스 내부에 정의된 멤버들을 사용

ex)toString(), equals() 등


(4)Package와 import

Package란?

클래스를 모아놓은 일종의 집합.

(유지보수 및 관리 용이)

보통 이클립스를 사용하면

패키지와 클래스 관계가 잘 보임

다른 패키지에 있는 클래스를 사용하고 싶을 때

예를 들어

packageA에 있는 PacA 클래스를 사용하고 싶은 경우

packageA.PacA practice = new packageA.PacA();

와 같이 참조함.

하지만 코드가 복잡하기 때문에

경로를 생략하고 써주는 것이 바로

import 패키지명.클래스명;

위에 예를 이어서

import packageA.PacA;

혹은

패키지 안에 모든 클래스를 이용하고 싶으면

import packageA.*;


(5)제어자

: 클래스나 멤버의 사용을 제어하기 위해 사용

Ⅰ. 접근 제어자

: 외부에서 접근할 수 있는 정도와 범위를 지정.

public : 접근 제한이 없음

protected : 같은 패키지 내에서와 자손 클래스에서 접근 가능

default : 같은 패키지 내에서만 접근 가능 (아무런 접근 제어자 작성하지 않았을 경우)

private : 같은 클래스 내에서만 접근 가능

Ⅱ. static

: 변수나 메서드 앞에 붙어 클래스 멤버라는 것을 의미.

앞 챕터에서 본 것처럼

클래스 멤버는 처음 클래스가 메모리에 로드될 때

생성되기 때문에

인스턴스를 생성하지 않아도 사용 가능

Ⅲ. final

: 내용이나 값 변경이 불가.

final 변수 : 값을 더 이상 변경할 수 없는 상수

final 메서드 : 내용을 더 이상 변경할 수 없는 메서드. 오버라이딩 불가

final 클래스 : 내용을 더 이상 변경할 수 없는 클래스. 상속 불가


(6)다형성

: 객체지향언어에서 객체의 자료형을 변경하는 것

객체지향 개념에서 다형성은

'한 가지 타입이 여러 가지 형태의 인스턴스를 가질 수 있다.'

라는 의미

지금까지는

인스턴스를 생성하고 참조변수에 할당할 때

인스턴스와 참조변수의 클래스 타입을 동일하게 작성했지만

A obj = new A();

다형성 정의에 따라

조상 클래스 타입의 참조변수로

자손 클래스 타입의 객체를 참조할 수도 있음

A obj = new B();

//클래스 B가 A를 상속할 때

※조상 클래스 타입의 참조변수로 자손 인스턴스를 참조하는 것만 가능

(그 반대는 에러)

class A{

void methodA(){ }

}

class B extends A{

void methodB(){ }

}

...

A obj = new B();

//obj는 A타입의 참조변수

obj.methodA();

//가능

obj.methodB();

// 에러발생

 

*이 챕터는 아직 미완성*

'백엔드개발 > Java' 카테고리의 다른 글

[Java] 일급 컬렉션  (0) 2024.10.30
[JAVA] StringBuilder  (2) 2024.10.12
[JAVA] BufferedReader와 Bufferedwriter  (0) 2024.10.12
[JAVA] 멘토씨리즈 자바 Chapter6  (2) 2024.10.12
[Java] 멘토씨리즈 자바 Chapter02-Chapter05  (1) 2024.10.12