접근제한자 활용
다형성 - oop의 꽃 향기만 남기고 갔단다
객체의 형변환
데이터 은닉과 보호, Encapsulation
- 정보를 보호하려면..?
- 변수는 private 접근으로 막기
- 공개되는 메서드를 통한 접근 통로 마련: seter / getter
- 메서드에 정보 보호 로직 작성
private String name = "김이박";
private int account = 10000;
생성자 구간..
// 메서드를 통해서. 우리가 생각하는 코드를 넣을 수 있다.
pulbic void setName(String name){
//데이터 보호 로직 추가.
if(name == null){
// null은 안돼!
return;
}
this.name = name;
}
public String getName(){
return this.name;
}
public void setAccount(int account){
if(account<0){
//마통은 좀...
return;
}
this.name = name;
}
오른쪽 클릭 => source => gernerate Getter / Setter
오른쪽 클릭 => source => gernerate Constructor
----------------------------------------------
Singleton - 객체를 하나만
- 객체를 제한해야 할 때.
- 여러 개의 객체가 필요 없는 경우
- 객체를 구별할 필요X => 수정 가능한 멤버 변수가 없고 기능만 있는 경우
- stateless 한 개체
- 객체 생성/삭제가 비용이 클 때
- Singleton 디자인 패턴
-
class Singleton{
//멤버 변수
private static Singleton sc = new Singleton();
public static Singleton getInstance(){
return sc;
}
// 외부에서 sc를 넣을 수 없음..
public void setInstance(Singleton sc){
this.sc = sc
}
private Singleton(){
//100만원!
}
}
Singleton sc1 = Singleton.getInstance();
------------------------------------------------
다형성, Polymorphism
- Poly,많다 + morphism, 사상
- 하나의 객체가 많은 형을 가질 수 있는 성질.
- 동일한 객체를 여러 타입으로 부를 수 있다.
붕어빵 - 풀빵 - 눅눅해짐..
잉어빵 - 바삭..?
잉어빵 is a 붕어빵.
- 상속 관계에 있을 때 조상 클래스의 타입으로 자식 클래스 객체를 레퍼런스 할 수 있다.
- 배열의 특징 - 같은 타입의 데이터를 묶음으로 다룬다.
- 다형성으로 다른 타입의 데이터(Person, SpiderMan)을 하나의 배열로 관리
void afterPoly(){
Person [] persons = Person[10];
person[0] = new Person();
person[1] = new Spider(); // 둘을 같은 배열에..!
}
Object는 모든 클래스의 조상.
- Object의 배열은 어떤 타입의 객체라도 담기 쌉가능.
- 사실 printf 는 Object를 파라미터로 받았던 것..!
다형성과 참조형 객체의 형 변환
- 메모리에 있는 것과 사용할 수 있는 것의 차이
- Person 위에 SpiderMan이 올라가 있지만 접근 불가..
메서드를 재정의 할 때 조상 클래스 보다 접근제한자가 같거나 더 넓어야..
참조형 객체의 형 변환
- 하위 타입을 상위 타입으로 형 변환 => 묵시적 캐스팅
- 자손 타입 객체를 조상 타입으로 참조: 형 변환 생략 가능
- 조상의 모든 내용이 자식에 있으므로
- 상위 타입을 하위 타입으로 형 변환 => 명시적 캐스팅
- 조상 타입 객체를 하위 타입으로 참조 : 형 변환 생략 불가.
- 조상을 무작정 자손으로 바꿀 수는 없다.
- instanceof 연산자 // 중요!!! 주관식 단답형. o 소문자
- 실제 메모리에 있는 객체가 특정 클래스 타입인지 boolean으로 리턴
- 모든 캐스팅은 검사하고.!
컴파일 에러, 런타임 에러.
참조 변수의 레벨에 따른 객체의 멤버 연결.
- 자식에 재정의 된 메소드가 있으면 자식껄 실행함.
- 정적 바인딩, static binding
- 컴파일 단계에서 참조 변수의 타입에 따라 연결이 달라짐
- 상속 관계에서 객체의 멤버 변수(static/instance)가 중복될 때 또는 static method
- 동적 바인딩, dynamic binding
- 다형성을 이용해서 메서드 호출이 발생할 때 runtime의 메모리의 실제 객체의 타입으로 결정
- 상속 관계에서 객체의 instance method가 재정의 되었을 때 마지막에 재정의 된 자식 클래스의 메서드가 호출됨.
- 최대한 메모리에 생성된 실제 객체의 최적화 된 메서드가 동작한다.
멤버 변수 blank final로 선언 시
- 생성자에서 초기화는 가능.
- 뒤늦게 변경은 불가.
ctl + shift + O => 자동 import 추가.
shift + alt + s => source 단축키
public class AlgoTest {
public static void main(String[] args) {
Algo a = new Algo();
Algo b = new Algo();
}
}
public class Algo {
int x;
//public Algo() {}
private static Algo instance= new Algo();
private Algo() {
}
public Algo getAlgo() {
// 안 만들어져 있으면 만들고 리턴.
if(instance == null) {
instance = new Algo(); // 레이지 이닛.
}
return instance;
}
}
객체는 만들어 진 그대로.
누가 참조하느냐 차이.
플러터 할 때 들어있던. super(), static이 이런 내용인지 배우니 신기.
23년 하반기 B형
A => 완탐, 시뮬, 문해력
B => 자료구조, 알고리즘을 써서 최적화 4시간 2문제
C =>
실력이 어느정도 올라왔는 때.
- 기출문제를 보자.
열린게시판 > B형 합격후기 보십쇼.
7/27 설문 open
2,3차 8/12 -
4차 10/28 -
주호석..
삼전 구현
삼sds 알고리즘
개선된 for문은 카피해서. 변경한다고 안 바뀜.
어노미너스 메소드로.. => 메소드 안에 선언해서..