학원에선 객체 배열을 공부했는데
이미 예습해서 아는 내용이기 때문에
내일 배울 상속을 대비해 예습했다
<패키지> 클래스+인터페이스의 묶음
클래스를 효율적으로 관리한다->같은 이름의 클래스여도, 다른 패키지에 존재 가능
클래스의 실제 이름은 패키지명을 포함한다
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 (불가)
그래서 자손->조상을 먼저 해야하는 듯...에라 몰라~~!
--------
내일 상속을 얼른 배우고 싶다!!!!
힘들지만 재미있다 ㅎㅎ
'국비 학원 가서 개발새발' 카테고리의 다른 글
국비학원 9일차) 상속, instanceof, 타입변환... 예습)인터페이스 (1) | 2022.10.08 |
---|---|
국비학원 8일차) 상속, protected, super..(예습:추상클래스) (1) | 2022.10.06 |
국비학원 6일차) 클래스 생성자를 배우다(예습:상속) (1) | 2022.10.04 |
혼자 공부) 오버로딩 외... (0) | 2022.10.02 |
국비학원 5일차) 변수의 종류와 호출 스택, 메소드 (1) | 2022.09.30 |