본문 바로가기
국비학원

[국비지원] KH 정보교육원 14일차

by 도전하는 개발자 2022. 4. 12.

Day 14

 4주차의 시작!! 오랜만에 해이해진 마음을 다잡을 겸 대면으로 수업을 나갔다. 확실히 대면수업이 버려지는 시간도 많고 체력소모도 있지만 수업 집중도만큼은 비대면수업에 비할 바가 아닌 것 같다! 비대면도 나름의 장점이 있지만 대면을 자주 나가야겠다는 생각이 들었다. 오늘은 접근제한자를 비롯해 getter-setter, Annotaion등 클래스 파트를 빠르게 마무리하고 상속 파트로 들어갔다. Java 수업을 할 시간이 많이 남지 않았다보니 점점 진도가 빨라지고 있다. 오히려 강사님의 설명이 컴팩트해져서 좋은 것 같기도...? 이해가 가지 않는 부분은 꼭 책을 통해 익히는 과정을 거쳐야겠다 ㅎㅎ

 


접근제한자
클래스 및 클래스의 구성멤버에 대한 접근을 제한하는 역할
다른 패키지에서 클래스를 사용하지 못하도록 클래스 제한
클래스로부터 객체를 생성하지 못하도록 생성자 제한
특정 필드와 메소드를 숨김처리하여 필드와 메소드 제한

 

(접근제한x) public -> protected -> default -> private (접근제한최대)

                    (protected = default+@)

접근할 수 없는 클래스
public 없음
protected 자식 클래스가 아닌 다른 패키지에 소속된 클래스
default 다른 패키지에 소속된 클래스
private 모든 외부 클래스

클래스에는 public과 default 둘만 사용가능
생성자-필드-메소드는 4가지 다 사용가능

클래스 접근제한 (public vs default)
public은 다른 패키지에서 사용가능
클래스 선언할 떄 public 생략시 자동으로 default임
이 경우 다른 패키지에서는 사용불가

생성자 접근제한 (매우드뭄)
생성자가 가지는 접근 제한에 따라 호출여부 결정 

필드와 메소드의 접근제한
클래스 내부, 패키지 내부, 패키지 상호간에 사용할지 고려해 선언

Getter
private 필드의 값을 리턴 (필요할 경우 필드값 가공)
getFieldName() (isFieldName())

Setter
외부에서 주어진 값을 필드 값으로 수정
setFieldName()

 

 

어노테이션 적용대상, 어노테이션 유지정책
어노테이션 적용

어노테이션 Annotation (주석)
프로그램에게 추가적 정보를 제공해주는 메타데이터

         23          : ?? 무슨의미?
<age>23</age> : 아~ 나이가 23이라는 말이구나~

어노테이션 용도
컴파일러에게 코드 작성 문법 에러 체크하도록 정보 제공 (@Override)
소프트웨어 개발 툴이 빌드나 배치 시 *코드를 자동 생성하게 정보 제공
실행 시(런타임시) 특정 기능 실행하도록 정보 제공 (SpringFrameWork의 Annotation)

어노테이션 타입 정의 
소스 파일 생성: AnnotatoinName.java
public @interface AnnotationName{
}

 

어노테이션 타입 적용
@AnnotationName

기본 속성(엘리먼트) value
public @interface AnnotationName{
   String value();   --------------------------> 기본 속성(엘리먼트) 선언
   int elementName() default 5;
}

어노테이션 적용대상
코드상에서 어노테이션을 적용할 수 있는 대상
java.lang.annotation.ElementType 열거 상수로 정의
ex) @Target ( {ElementType.TYPE, ElementType.FIELD, ElementType.METHOD} )

어노테이션 유지정책
어노테이션 적용 코드가 유지되는 시점을 지정하는 것
java.lang.annotation.RetentionPolicy 열거 상수로 정의
ex) @Retention(RetentionPolicy.RUNTIME)

 

어노테이션 정의
어노테이션 적용 클래스

 


              <동물>                - 소리를 내라 메소드
           ↗    ↑    ↖            - 상속!!!! 
<강아지> <고양이> <사자>
   멍멍       야옹        어흥    - 다형성

똑같은 메소드인데 결과가 다름 -> 다형성!!
*다형성의 전제조건 : 상속!!!!

 

 

 

부모 클래스
자식 클래스
자식 클래스 사용

상속
자식 클래스가 부모 클래스의 멤버를 물려받는 것
자식이 부모를 선택해 물려받는다!
상속 대상 : 부모의 필드와 메소드 (생성자는 물려주는거 아님 객체를 생성할 때 필요할 뿐)

상속의효과
부모 클래스 재사용해 자식 클래스 빨리 개발 가능
반복된 코드 중복 줄임
유지 보수 편리성 제공
***객체의 다형성 구현가능***

상속 대상 제한
부모 클래스의 private 접근 갖는 필드와 메소드 제외
부모 클래스가 다른 패키지에 있을 경우, default 접근 갖는 필드와 메소드도 제외

extends 키워드
자식 클래스가 상속할 부모 클래스를 지정하는 키워드
public class A {
   int field A;
   void methods1() {...}
}

public class B extends A {  ----> (extends A :A를 상속)(단일상속!)
   String field B;
   void methods2() {...}
}

자식클래스 B가 부모클래스 A를 상속받는다 (X)
자식클래스 B가 부모클래스 A를 extends 받는다! (O)

자식 객체 생성할 때는 부모 객체부터 생성 후 자식 객체 생성
부모 생성자 호출 완료 후 자식 생성자 호출 완료

명시적인 부모 생성자 호출 (super(...))
부모 생성자에 매개변수가 있으면 개발자가 명시적으로 super() 이용해 호출해야 한다.
(매개변수 없으면 컴파일러가 알아서 호출함)
부모 객체 생성할 때, 부모 생성자 선택해 호출

 

메소드 재정의(@Override) - 부모 클래스
메소드 재정의(@Override) - 자식 클래스
메소드 재정의(@Override) - 메소드 오버라이딩 테스트

 

메소드 재정의(@Override)
부모 클래스의 상속 메소드 수정해 자식 클래스에서 재정의하는 것

메소드 재정의 조건 
부모 클래스의 메소드와 동일한 시그니처(리턴타입, 메소드명, 매개변수선언부) 가져야
접근 제한을 더 강하게 오버라이딩 불가 ( public을 default나 private으로 수정 불가, 반대는 가능)
새로운 예외(Exception)(오류) throws 불가 (예외처리는 10장 참조)

@Override 어노테이션
컴파일러에게 부모 클래스의 메소드 선언부와 동일한지 검사 지시
정확한 메소드 재정의 위해 붙여준다

메소드 재정의 효과 (다형성2!!)
부모 메소드는 숨겨지고 재정의된 자식 메소드 실행

다형성 2 : 소리를내라(웅) ---재정의---> 강아지(멍멍), 고양이(야옹)
부모 메소드가 맘에 안 들어서 재정의하면 
상속메소드 호출시 무조건 재정의된 메소드가 호출된다

 

super 변수
super 변수
super 변수

 

부모 메소드 사용(super)
super.부모메소드()
메소드 재정의는 부모 메소드 숨기는 효과 !!
자식 클래스에서는 재정의된 메소드만 호출

자식 클래스에서 수정되기 전 부모 메소드 호출 - super 사용
왜냐면 super는 부모 객체 참조하기 때문 (cf) this는 자신 객체 참조)

 

 

상속할 수 없는 final 클래스
상속할 수 없는 final 클래스

 

재정의할 수 없는 final 메소드
재정의할 수 없는 final 메소드

 

final 클래스와 final 메소드
final 붙일 수 있는것
1.필드 2.매개변수 3.지역변수 
+ 4. 클래스 5. 메소드

final 클래스: 부모로 사용 불가한 클래스 (상속 불가!!)
final 메소드: 자식이 재정의할 수 없는 메소드 (오버라이딩 불가!!)

 

protected 접근 제한자 A - 같은 패키지에 있는 경우
protected 접근 제한자 B - 같은 패키지에 있는 경우

 

protected 접근 제한자 C - 다른 패키지에 있는 경우
protected 접근 제한자 D - 다른 패키지에 있는데 자식 클래스인 경우

 

 

protected 접근 제한자
상속과 관련된 접근 제한자
같은 패키지: default와 동일
다른 패키지: 자식 클래스만 접근 허용

접근할 수 없는 클래스
public 없음
protected 자식 클래스가 아닌 다른 패키지에 소속된 클래스
default 다른 패키지에 소속된 클래스
private 모든 외부 클래스

-------- Clazz 객체 (클래쯔 객체) 의 레퍼런스를 얻는 방법 3가지 -----------

(1) 타입명.class 속성이용:
     ex) Class clazz = String.class;

(2) 참조타입명.getClass() 메소드 이용:
     ex) String name="Yoseph";
          Class clazz = name.getClass();

(3) Class.forName(FQCN) 메소드 이용:
     ex) Class clazz = Class.forName("java.lang.String");

Java Reflection API ----> Clazz 객체를 얻는 것이 시작

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