본문 바로가기
국비 학원 가서 개발새발

국비학원 7일차) 예습:패키지,(접근)제어자,캡슐화,다형성,참조변수 형변환

by 휴일이 2022. 10. 5.

학원에선 객체 배열을 공부했는데

이미 예습해서 아는 내용이기 때문에

내일 배울 상속을 대비해 예습했다

 

 

 

<패키지> 클래스+인터페이스의 묶음

클래스를 효율적으로 관리한다->같은 이름의 클래스여도, 다른 패키지에 존재 가능

클래스의 실제 이름은 패키지명을 포함한다

ex)String->java.lang.String / java디렉토리의->서브 디렉토리lang->에 속한 String.class 파일

ㄴ 패키지로 다른 패키지 포함 가능

클래스가 물리적으로(.class)인 것처럼, 패키지는 물리적으로 하나의 디렉토리

pakage 패키지명; 으로 선언

소문자로 짓는 것이 관례라고 한다(클래스와 구분하기 위해)

패키지를 선언 안 하면 기본제공패키지(unnamed pakage)소속

 

클래스패스->패키지의 루트 디렉토리를 클래스 패스에 포함시키면 cmd에서 불러오기, 생략가능

 

<import>

사용하고자 하는 패키지를 미리 명시하는 것, 원래는 패키지명+클래스명 으로 쓰는데 import써서 생략

java.util.Date today = new java.util.Date(); <-매웅 귀찮음

 

import java.util.Date;

Date today = new Date(); <-간편

 

import문 -> 컴파일러에게 소스파일에 사용된 클래스의 패키지 정보를 제공함

이클립스 단축키 컨트롤+시프트+o / 인텔리제이 알트+엔터

import 패키지명.*; 해도 실행시 성능차이는 없다!!

 

 

<static import> -> static 멤버 호출시, 클래스 이름 생략 가능

import static java.lang.Integer.*; //Integer클래스의 모든 static 메소드

import static java.lang.Math.random; // Math.random() -> random()만 쓰면 됨

import static java.lang.System.out; // System.out.println() -> out.println() 가능

 

 

<제어자> 클래스, 변수, 메소드 선언부에 선언->부가적인 의미 부여

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

- 그 외 : static , final , abstract , native , transient , synchronized , volatile , scrictfp

 

클래스,전역변수,메소드에 주로 사용, 여러 제어자 조합도 가능하다!

ㄴ 단, 접근 제어자는 한 번에 하나만 사용...

static / final / abstract 만 일단 알아두기

 

 

<static> 공통적인 -> static 변수는 인스턴스에 관계없이 같은 값. 모든 인스턴스가 공유함

static이 붙으면 : 인스턴스 생성 안 해도 사용 가능

static 메소드에는 : static 변수만 사용 가능

ㄴ 전역변수, 메소드, 초기화 블럭에 사용한다

 

static 전역변수 - 1. 모든 인스턴스에 공통값 2. 인스턴스 없어도 사용 가능 3. 클래스가 메모리에 올라갈 때 생성

static 메소드 - 1. 인스턴스를 생성 안 해도 호출 가능 2. 인스턴스 멤버를 직접 사용 불가

ㄴ인스턴스 멤버 사용이 없다면 static을 붙여보자! 편리하고 속도도 빠르다 :)

 

 

<final> 마지막의, 변경될 수 없는 - 거의 모든 대상에 사용 가능

final 클래스 - 변경X 확장X 다른 클래스의 조상이 될 수 없음 (상속불가)

final 메소드 - 변경X 오버라이딩X (재정의 불가)

final 전역,지역변수 - 값 변경 불가X (상수가 됨)

 

 

<abstract> - 미완성의, 추상의

메소드 선언부만 작성하고, 실제 내용은 구현 안 한 "추상 메소드" 사용

클래스 내에 추상 메소드가 존재한다는 것을 알림 " 추상 클래스 " 정의

 

abstract 클래스 : 클래스 내에 추상 메소드가 선언됨을 알림

abstract 메소드 : 선언부만 작성하고 구현부{} 가 없는 추상 메소드

->추상 클래스는 미완성 설계도이므로 인스턴스 생성 불가(미완성 추상 메소드가 존재)

 

 

 

<접근 제어자> - 멤버나 클래스를 외부에서 접근 못하게 제한

클래스 / 전역변수 / 메소드 / 생성자 사용 가능

 

private - 같은 클래스 내에서만 접근 가능 (private 변수 set, get메소드로 정의하고 출력)

default(안씀) - 같은 패키지 내에서만 접근 가능

protected - 같은 패키지 또는 다른 패키지에 있는 자손 클래스만 접근 가능

public - 접근 제한 없음

public > protected > default > private

 

 

<캡슐화와 접근제어자> - 클래스 or 멤버 (주로 멤버에 사용)

캡슐화 하는 이유

1. 외부로부터 데이터 보호 : 비밀번호 등, 함부로 변경 불가하고 유효값을 유지하기 위해

2. 외부에는 불필요한, 내부적으로만 사용되는 부분 감추기

ㄴ 내부에서만 작업하는 전역변수, 클래스 내에서만 사용되는 메소드...

get -> 멤버변수 값 반환 / set -> 매개변수에 지정된 값을 검사하여 조건이 맞으면 변경 가능

- 상속을 통해 확장이 예상되면, private 대신 protected 사용! (자손이 접근 가능하도록)

 

 

<다형성> - 여러 형태를 가지는 능력

한 타입의 참조 변수로 여러 타입의 객체를 참조하는 것을 말한다

조상 타입의 참조 변수로 -> 자손 클래스의 인스턴스 참조 가능!

 

Tv t = new SmartTv()

조상 클래스 Tv가 참조변수 t 로 자손 클래스인 SmartTv의 객체를 넣음

 

자손은 무조건 조상보다 멤버가 같거나 많다-> 그 중 조상에게 물려받은 멤버만 사용 가능

자손 5(조상꺼)+2 = 7  < ------ 여기에서 5만 사용가능하다는 얘기 나머지 2개는 사용못함

자손이 조상 타입의 인스턴스를 가져올 순 없음

->조상이 멤버가 더 적음, 자손 껄 가지고 오면 못사용하는 멤버(자손에게만 있는)가 있음

 

O 조상 타입의 참조변수 -> 자손 타입 인스턴스 참조 가능 (Parent p = new Child())

X 자손 타입의 참조변수 -> 조상 타입의 인스턴스 참조 불가 (Child c = new Childe()<-에러)

ㄴ사용할 수 있는 기능이 n개인데 다른 기능(n+i)도 가지고 있으니까 사용불가 ㅠㅠ

 

 

<참조 변수의 형변환>

상속 관계에서만 사용 가능하다

자손 -> 조상 / 조상 -> 자손 ////조상의 조상으로도 가능! 상속관계면 다 가능!

                 /  Car (조상) \

Engine(자손)         Ambulance(자손)

 

Engine e -> Car 형변환 O

Car c -> Engine 형변환 O

Engine e <->Ambulance 형변환 X : 상속 관계가 아님

 

Engine e = new Engine();

Car c = (Car)e     ----자손 -> 조상 형변환은 *생략가능*

Engine e2 = (Engine)c  ---- 조상->자손 형변환은 *생략불가*

ㄴ 참조형의 형변환은 변수처럼 주소값이 변환되는 것이 아님!!!

 

참조변수의 형변환 -> 리모컨(참조변수)를 다른 종류로 바꾸는 것

ㄴ 멤버 개수 조절을 위해

 

자손->조상 (생략가능) : 다룰 수 있는 멤버의 개수가 줄어듬. 항상 안전!

조상->자손 (생략불가) : 다룰 수 있는 멤버 개수 늘어남. 위험하니 알아두라고 표시!

 

처음 객체에서 멤버가 늘어나선 안 됨

7 -> 5 -> 7 (가능)

7 -> 9 -> 7 (불가)

그래서 자손->조상을 먼저 해야하는 듯...에라 몰라~~!

 

 

 

--------

 

 

내일 상속을 얼른 배우고 싶다!!!!

힘들지만 재미있다 ㅎㅎ

728x90