[객체 지향 프로그래밍]
추상화
추상화란 어디서 어디까지가 내가 필요한 절차의 묶음이냐..
클래스와 객체
-클래스란 일반적인 동작과 속성을 설명하는 이름 붙여진 문(statement)의 구조
-클래스란 객체를 찍어내기 위한 청사진 같은 것.
-객체지향에서 클래스가 중요한 이유는 객체가 어떻게 동작할지 설명해놓은 것이기 때문에.
객체의 세가지 특징
1. Identity(ID): 한 객체는 다른 객체들과 구분될 수 있음
2. Behavior(행동): 객체는 작업을 수행함 (중요!)
3. Sate(상태): 객체는 상태를 포함함
클래스는 설계도. 객체는 설계도를 가지고 찍어낸 것.
클래스는 유전자. 객체는 유전자를 가지고 찍어낸 우리.
객체는 object 개체는 entity (entity는 데이터, 속성만 가져온다)
객체는 동작을 중심으로 동작에서 비롯된 속성의 변화.
추상화
불필요한 것을 선택하고 제거하는 것
현재 context에서 중요한걸 뽑아서 모델링하느냐
캡슐화
캡슐화의 변수는 protected, private (숨긴다) 메서드는 public
내부적으로 어떤 변화에 상관 없이동작을 숨길 수 있고 외부에서 어떻게 동작하는지 볼 필요 없이, 스펙만 보면 된다.
예를 들자면 전기차와 내연기관 차. 전기차는 배터리로 동작하고 내연기관차는 연료가 줄음. 하지만 운전자의 경우는 배터리가 다는지 연료가 다는지.. 어떻게 돌아가는지 동작은 중요하지 않은 거처럼. 추상화를 하징 낳았으면 운전자가 연료 탱크를 열고 돌리고 하는 작업을 해야할것. 추상화를 해서 프로시저를 만들어 놓으면 운전자는 액셀을 밟는 동작만 하면 된다.
public class Account {
private int balance; //전역변수는 메모리 올라가면 자동으로 초기화가 된다.
Account account; //이건 기본값이 null로 초기화된다
public void deposit(int amount){
this.balance += amount;
}
public boolean withdraw(int amount){
if(balance < amount){ //잔고가 작으면 false하고 끝내
return false;
}else{
balance -= amount; //balance에서 amount를 빼고 트루 리턴하고 끝내
return true;
}
}
public int getBalance(){ //외부에 잔액을 알려주는 get 메서드. Getter
return this.balance;
}
/*
public void setBalance(int balance){ //setter는 이런 경우에 쓰면 안됨!! 여기에선 deposit과 withdraw가 세터의 역할을 함.
this.balance = balance;
}
*/
public static void main(String[] args){
Account acc = new Account(); //힙 영역에 객체가 올라가는 공간이 있는데 거기에 new를 이용해서 힙 영역에 공간을 할당함. acc는 클래스 타입의 인스턴스다?
System.out.println(acc.getBalance()); //이렇게 호출하면 겟발란스는 메서드-> 메서드 안에 밸런스를 호출한다.
acc.deposit(100);
acc.withdraw(30);
System.out.println(acc.getBalance());
}
}
게터/ 세터
public class GetterSetter {
private int accountNumber;
//게터세터 캡슐화에 관점에서 값을 할당하고 가져오는 것
public int getAccountNumber(){ //게터
return this.accountNumber; //this = 객체가 되었을 때 내 자신
}
public void setAccountNumber(int accountNumber){//세터.
this.accountNumber = accountNumber;
}
}
클래스가 찍어낸 객체가 인스턴스
This
-객체에 속한 것.
-static은 this가 될 수 없다.
-동적으로 움직이는 객체의 데이터
1. 은행 계좌 만들기
2. 강화된 캡슐화 버전
this가 어떻게 돌아가는가
상속
class Musician{
void play(){}
}
public class Guitarist extends Musician{
void play(){
System.out.println("Play Guitar");
}
}
public class ViolinPlayer extends Musician{
void play(){
System.out.println("Play Violin");
}
}
Musician me = new Guitarist();
me.play();
Musician me2 = new ViolinPlayer();
me2.play();
abstract class Musician{ //이 클래스는 분류를 위한 추상 클래스. 또는 인터페이스로 선언해도 된다.
void play();
}
class Guitarist extends Musician{
void play(){
System.out.println("기타");
}
}
class ViolinPlayer extends Musician{
void play(){
System.out.println("바이올린");
}
}
Musician guitarist = new Guitarist();
guitarist.play();
Musician violinPlayer = new ViolinPlayer();
violinPlayer.play();
Musician player2 = new Musician();
player2.play();
다형성 구현: 같은 건데 다르게 동작하게 하는 것. 위에 클래스는 비워두고 하위 클래스에 구현을 하는 경우.
추상 클래스: 나로부터 상속된 클래스들에게 데이터외 행동을 전해주는 역할
추상 클래스를 만들면 메모리에 공간이 생긴다!
인터페이스는 생기지 않는다. 인터페이스는 객체가 아니라 타입이다. 어떤 클래스가 이런 동작을 반드시 해야함을 설명해주는 것.
추상 클래스는 구현을 하고 싶을 때 사용한다. 모든 객체가 인스턴스 모든 동작의 구현이 있을 때 사용. : 데이터, 그리고 구현을 상속하는 같은 타입을 만들고 싶을 때
인터페이스는 타입을 만들어서 같은 타입으로 동작해야 할 필요가 있을 때
클래스 : 코드 차원, 찍어내기 위한 블루 프린트 / 객체: 메모리
캡슐화: 데이터와 동작을 한데 묶은 것. 액세스에 제한을 두는 것. 장점: 동작을 캡슐화해서 사용자가 프리 컨디션, 포스트 컨디션을 보면 코드를 보지 않아도 어떠한 규변적인 동작을 한다는 것을 알 수 있게 한다. 추상화에 도움을 준다. 1. 필드(전역변수)를 프라이빗, 메서드는 퍼블릭으로 선언하는 방법.
객체 지향: new를 연산자를 통해 객체를 생성. 메모리 얼로케이션에 올리면 . 다형성을 이용해서 재사용화를 궁극화하는 것.
생성자는 메서드?
객체지향 시스템 정의: 상속 관계. 상속을 만들다 보면 클래스의 계층 구조가 나옴. 클래스가 인스턴스화가 되어야 하는지 아닌지, 데이터를 넘기는지 타입만 있는지 따져보고 추상 클래스, 인터페이스 구분.
추상 클래스: 나에게서 상속되는 클래스의 데이터와 일부 구현을 상속해야할 때
이른/ 늦은 바인딩:
이른 바인딩- 컴파일러가 미리 바인딩을 다 해놀 때
늦은 바인딩