2023.04.25 코드스테이츠 11일차.

2023. 4. 25. 19:02Code

반응형

상속 ( extends )

- extedns : 기존의 것에서 확장, 이어 붙어짐

- 상위클래스 ( 부모클래스, 슈퍼클래스 ) -> 하위클래스 ( 자식클래스, 서브클래스 )

- 부모가 가진 맴버를 재활용 가능하게 하는 기능

- 기존의 클래스를 재활용하여 새로운 클래스를 작성하는 자바의 문법 요소

- 두 클래스를 서로 상속 관계에 있다고 하며, 하위 클래스는 상위 클래스가 가진 모든 맴버( 필드, 메서드, 이너클래스 )를 상속 받게 된다

- 하위 클래스의 맴버 개수는 언제나 상위 클래스의 맴버와 비교했을 때 같거나 많다

## 코드를 재사용하여 보다 적은 양의 코드로 새로운 클래스를 작성할 수 있어 코드의 중복을 제거할 수 있다 ##

- 다형적 표현이 가능하다 ( 하나의 객체가 여러모양으로 표현될 수 있다 )

- 클래스명 다음에 extends 상위클래스명 을 사용하여 정의한다

 

- 객체지향 프로그래밍에서는 단일 상속만을 허용한다 !

 

 

포함 관계

- 포함은 상속처럼 클래스를 재사용할 수 있는 방법으로 클래스의 맴버로 다른 클래스 타입의 참조변수를 선언하는 것 이다

 

 

위 예시를 보면, 한 회사의 근로자(Employee)를 표현하기 위한 Employee 클래스의 멤버 변수로 근로자가 사는 개략적인 주소를 나타내는 Address 클래스가 정의되어 있다.

 

원래라면 Address 클래스에 포함되어 있는 인스턴스 변수 city와 country를 각각 Employee 클래스의 변수로 정의해주어야 하지만, Address 클래스로 해당 변수들을 묶어준 다음 Employee 클래스 안에 참조변수를 선언하는 방법으로 코드의 중복을 없애고 포함관계로 재사용하고 있다

 

 

- 객체지향 프로그래밍에서 상속보다 포함을 사용하는 경우가 대다수 이다

- ‘상속포함둘중 어느 것을 사용 할지 판단 하는 것은 클래스 간의 관계가 ‘~~이다(IS-A)’ 관계인지 ~~을 가지고 있다(HAS-A) 관계인지 문장을 만들어 생각해 보는 것이다

Ex. EmployeeAddress이다 라는 문장은 성립하지 않지만 mployeeAddress를 가지고 있다는 올바른 문장이 되기 때문에 포함관계 사용이 적합하다

Ex. 토마토는 야채를 가지고 있다라는 문장은 이상하지만 토마토는 야채이다 라는 문장은 어색하지 않으므로 이 관계에서는 상속을 사용하는 것이 적합하다

 

 

메서드 오버라이딩

- 상위 클래스로부터 상속받은 메서드와 동일한 이름의 메서드를 재정의 하는 것

- 동일한 위치에 동일한 파일을 저장하고자 할 때 주로 사용하는 덮어쓰기를 연상하면 이해하기 쉽다

- 위 코드는 Bike, Car, MotorBike Vehicle에 상속되어 있고 run() 메서드는 각각의 클래스에서 재정의 함으로써 Vehicle클래스의 run() 메서드를 오버 라이딩 하고 있다.

- Bike, Car, MotorBike의 인스턴스를 통해 run() 메서드를 호출하면 Vehiclerun()이 아닌, Bike, Car, MotorBikerun()이 호출된다

 

메서드 오버라이딩의 3가지 조건

1. 메서드의 선언부(메서드 이름, 매개 변수, 반환 타입)가 상위 클래스의 메서드와 완전히 일치해야 한다

2. 접근 제어자의 범위가 상위 클래스의 메서드보다 같거나 넓어야 한다

3. 예외는 상위 클래스의 메서드보다 많이 선언할 수 있다

 

 

super 키워드와 super()

1. Super 키워드

- super 키워드는 상위 클래스의 객체, spuer()는 상위 클래스의 생성자를 호출 한다

 

- SubClassSuperClass로부터 변수 count를 상속받는데 자신의 인스턴스 변수 count 와 이름이 같아서 둘을 구분할 방법이 필요하다

- 두 개의 같은 이름의 변수를 구분하기 위해 super 키워드를 사용한다

- super키워드를 사용하지 않으면 해당 객체는 자신이 속한 인스턴스 객체의 맴버를 먼저 참조한다

- super키워드를 사용하면 부모의 객체 멤버 값을 참고 할 수 있다

 

 

2. Super()

super() 메서드 도 생성자 안에서만 사용 가능하고, 반드시 첫출에 와야한다

- 모든 생성자의 첫줄에는 반드시 this(), super() 가 선언되어야 한다

- super()가 없는 경우에는 컴파일러가 생성자의 첫 줄에 자동으로 super()를 삽입한다

이때 상위 클래스에 기본생성자가 없으면 에러가 발생하게 된다 그렇기에 클래스를 만들 때에는 자동으로 기본 생성자를 생성하는 습관을 들이는 것이 좋다!!

 

 

클래스의 정점, Object 클래스

- Object 클래스는 자바의 클래스 상속계층도에서 최상위에 위차한 상위클래스 이다.

- 자바의 모든 클래스는 Object 클래스로부터 확장 된다

- 아무런 상속을 받지 않는 클래스에는 자동으로 extends Object를 추가하여 Object 클래스를 상속받도록 한다

- Object 클래스는 자바 클래스의 상속계층도에 가장 위에 위치하기 때문에 Object 클래스의 멤버들을 자동으로 상속받아 사용할 수 있다

 

* Object 클래스의 대표적인 메서드

 

메서드명 반환 타입 주요 내용
.toString() String 객체 정보를 문자열로 출력
.equals(Object obj) boolean 등가 비교 연산(==)과 동일하게 스택 메모리 값을 비교
.hashCode() int 객체의 위치 정보 관련, Hashtable 또는 HashMap에서 동일 객체여부 판단
.wait() void 현재 스레드 일시정지
.notify() void 일시정지 중인 스레드 재동작

 

 

 

캡슐화

- 특정 객체 안에 관련된 속성과 기능을 하나의 캡슐로 만들어 데이터를 외부로 부터 보호 하는 것

1. 데이터의 보호

2. 내부적으로만 사용되는 데이터데 대한 불필요한 외부 노출 방지

( 정보은닉)

 

-캡술화를 수행하는 데는 접근제어자, getter, setter 메서드 가 있다

 

 

패키지

- 특정한 목적을 공유하는 클래스와 인터페이즈의 묶음

- 패키지는 클래스들을 그룹 단위로 묶어 효과적으로 관리하게 위한 목적

- 패키지는 물리적인 하나의 디렉토리, 하나의 패키지에 속한 클래스나 인터페이스 파일은 모도 해당 패키지에 속하여 있다

- 디렉토리는 하나의 계층 구조를 가지고 있고, 계층 구조 간 구분은 점(.)으로 표현된다

- 패키지가 있는 경우 소스 코드의 첫 번째 줄에 반드시 package 패키지 명이 표시되어야 하고, 만약 패키지 선언이 없으면 이름 없는 패키지에 속하게 된다

Ex. 주로 사용하는 String 클래스의 실제 이름은 java.lang.String인데, 여기서 java.lang은 패키지 명을 나타내고 점(.)을 사용하여 디렉토리 계층 구조를 나타내고 있다.

- 패키지로 클래스를 묶는 것의 장점은 클래스의 충돌을 방지해 주는 기능 이다.

-  같은 이름의 클래스를 가지고 있더라도 각각 다른 패키지에 소속되어 있다면 이름멸으로 인한 충돌이 발생하지 않는다

 

 

 

.

Import 문

- 다른 패키지 내의 클래스를 사용하기 위해 사용

import 패키지 명.클래스 명; 또는 import 패키지 명.*;

으로 작성하여 사용한다.

 

접근 제어자

제어자 ( Modifier )

- 클래스, 필드, 메서드, 생성자 등에 부가적인 의미를 부여하는 키워드 이다 ( 형용사의 역할과 같다 )

- 접근 제어자기타 제어자로 구분된다

 

1. 접근 제어자 : public, protected, (default), private

2. 기타 제어자 : static, final, abstract, native, transient, synchronized 등

 

- 하나의 대상에 대해서 여러 제어자를 사용할 수 있다

- 각 대상에 대해서 접근 제어자는 단 한번만 사용할 수 있다 !

 

 

접근제어자 ( Access Modifier )

클래스 외부로의 불필요한 데이터 노출을 방지 할 수 있고 외부로부터 데이터가 임의로 변경되지 않도록 막을 수 있다

접근제어자 접근 제한 범위
private 동일 클래스에서만 접근 가능
default 동일 패키지 내에서만 접근 가능
protected 동일 패키지 + 다른 패키지의 하위 클래스에서 접근가능
public 접근 제한 없음

- 접근 제한 범위는 public(접근 제한 없음) > protected(동일 패키지 + 하위클래스) > default(동일 패키지) > private(동일 클래스)    이다

- default의 경우는 아무런 접근 제어자를 붙이지 않는 경우 기본적인 설정을 의미합니다. 

- 변수명 앞에 아무런 접근 제어자가 없는 경우에는 자동으로 해당 변수의 접근 제어자는 default가 된다

- 접근 제어자를 통해 외부로부터 데이터를 보호하고, 불필요하게 데이터가 노출되는 것을 방지 할 수 있다

 

 

getter 와 setter 메서드

private 접근 제어자가 포함되어있는 객체의 변수의 데이터 값을 추가하거나 수정 하고 싶을때 getter와 setter 메서드 를 사용할 수 있다

- setter 메서드는 외부에서 메서드에 접근하여 조건에 맞을 경우 데이터 값을 변경할 수 있게 해 주고 일반적으로 메서드명에 set-을 붙여서 정의한다

- getter 메서드는 이렇게 설정한 (  set-을 사용해서 설정 ) 변수값을 읽어오는 데 사용하는 메서드이다 get-을 메서드명 앞에 붙여서 사용한

 

 

금일 학습 복습 예

 

 

 

// 금일은 상속과 캡슐화에 대해 학습을 하였다. 먼저 상속의 개념은 하위 클래스에서 상위 클래스의 맴버를 사용 할 수 있다는 점이  흥미로웠고 재밌엇다. 클래스따로 생성 하더라도 하위 클래스에서 상위 클래스의 맴버를 사용, 필요 할 때가 있으면 상속을 시켜 그 맴버를 사용할 수 있다는 것을 이해하는데에는 그렇게 오래 걸리지 않았지만 포함관계가 나오면서 그 둘의 차이점을 아는데에는 꽤나 오랜시간이 걸렸다.

학습 자료에 나와있는 코드를 인텔리제이에 옮기고 그 코드에  대한 설명을 주석으로 다는 것도 아직은 앞에 학습했던 클래스,객체,필드,메서드, 생성자 부분에 대한 이해도가 높지 않아 굉장히 어려운 일이였지만 학습방법을 이렇게 ( 코드 옆에 주석을 달아 이 코드에 대한 설명) 바꿔서 하는 것은 오늘이 처음이라 그런걸 수도 있겟다고 느꼈다.  앞으로 코드를 분석할 때에는 그냥 코드를 눈으로 보고 이해 뭔지 이해하려기 보단 직접 일텐리제이에 코드를 옮기도 주석으로 이 코드를 내가 직접 손으로 설명하는 학습방법으로 지속적인 학습을 해야 겠다.

 

 

728x90