Java

[Java] 객체지향 [{클래스, 인스턴스}, {접근제어자,get,set}, {오버로딩, 오버라이딩}]

코복이 2023. 8. 17. 11:02
728x90

 

공통적으로 갖는 특성을 묶어서 분류하는 것이 객체 지향의 핵심

 

설계 = 클래스 = 부모 클래스

결과물 = 인스턴스 = 상속받은 자식 클래스

 

정적인 정보는 멤버 변수 (이름, 나이 등)

동적인 기능은 메소드 (액션)

 

# 클래스 정의

public class BankAccount {
// 멤버변수
int bankCode;
int accountNo;
String owner;
int balance;
boolean isDormant;
int password;

// 메소드
void inquiry(){}
void deposit(){}
void withdraw(){}
void heldDormant(){}

// 생성자:
// 1)클래스 내부에 정의
// 2)생성자 메서드명은 클래스명과 일치해야한다.
// 3)new 연산자로 인스턴스 생성
// 4)this 는 생성자 자신을 뜻함
BankAccount(
int bankCode,
int accountNo,
String owner,
int balance,
int password,
boolean isDormant
){
//
this.bankCode = bankCode;
this.accountNo = accountNo;
this.balance = balance;
this.owner = owner;
this.password = password;
this.isDormant = isDormant;
}
}

 

 

# 인스턴스 생성

클래스의 정의를 기반으로 메모리에 실제로 생성된 개별 객체를 말합니다. 예를 들어, BankAccount 클래스로부터 생성한 객체를 BankAccount 클래스의 인스턴스라고 할 수 있습니다.

public class test {
public static void main(String[] args) {
BankAccount account = new BankAccount(1,2,"3",4,5,true);
System.out.println(account); // 주소값
System.out.println(account.accountNo); // 2
}
}

 

 

 

# 상속

상속(inheritance): 하나의 클래스가 다른 클래스로부터 속성과 동작을 물려받는 것을 의미합니다. 부모 클래스로부터 상속을 받은 클래스는 부모 클래스의 멤버 변수와 메소드를 물려받아 사용할 수 있습니다.

 

* 자바는 단일상속 언어 (하나의 클래스만 상속받을 수 있음)

 

# 오버로딩

- 아예 새로운 메서드 정의

- 부모 클래스에서 받은 메서드의 파라미터를 자식클래스에 맞게 변경하는 행위

- 파라미터의 타입, 개수 등을 변경

- 리턴 타입도 바뀌어도 됨

e.g. 부모 놀이기구 클래스의 입장 메소드의 파라미터는 동그란 티켓인데 자식 회전목마 클래스의 입장 메소드의 파라미터는 네모난 티켓과 현금 1,000원을 더 내야한다.

 

 

# 오버라이딩

- 상속받은 메서드의 동작 방법만 변경

- 상속받은 메서드의 파라미터 그대로 사용 (타입, 개수 등 그대로)

- 리턴 타입도 그대로

e.g. 부모 놀이기구 클래스는 파라미터로 동그란 티겟이 필요하고 티켓을 내면 5분간 태워주는데 자식 바이킹 클래스 또한 동그란 티겟이 필요하지면 티켓을 내면 1분만 태워준다.

 

 

 

# 접근제어자 private, public

- 보통 멤버변수는 클래스 외부에서 수정하지 못하도록 private 설정

* 읽거나 수정하려면 getter, setter 함수를 통해서 

- 메서드에는 public 설정

// private 멤버변수에는 외부에서 수정하지 못하도록 private 설정
private int bankCode;
private int accountNo;
private String owner;
private int balance;
private boolean isDormant;
private int password;

// 메소드
public void inquiry(){}
public void deposit(){}
public void withdraw(){}
public void heldDormant(){}

 

접근을 제어하는 이유는, 의도치 않은 실수 예방과 정보 은닉

 

 

 

# 접근제어자 getter, setter 함수

* 클래스 내부에 선언

* 마우스 우클릭 => Generate 를 통해 쉽게 생성 가능

// getter, setter
// get 값을 불러옴
// set 값을 변경

public int getPassword() {
return password;
}

public void setPassword(int password) {
this.password = password;
}

 

 

# 상속받은 인스턴스에서 password 수정, 읽기

public class test {
public static void main(String[] args) {
BankAccount account = new BankAccount(1,2,"3",4,5,true);

// private 멤버변수의 값을 setter 함수를 통해 변경
account.setPassword(12345);

// 변경했으니 getter 함수로 변경된 값을 가져와야 함
// System.out.println(account.passowrd); // 이건 기존 값을 가져오려해서 오류
System.out.println(account.getPassword()); // 12345
}
}

 

728x90