1. 객체(Object)란?
- 현실 : 식별 가능한 모든 것 (속성 + 기능을 지님)
- Java : 클래스에 정의된 내용대로 new 연산자에 의해서 Heap 메모리 영역에 생성된 것
2. 객체 지향 언어 || 객체 지향 프로그래밍(OOP)
- 현실 세계가 객체로 이루어져 객체 간의 상호작용으로 사건이 발생한다.
- 파는 채러다임을 컴퓨터로 옯겨 놓은 것 / 옴겨 놓은 프로그래밍 방식
3. 클래스 (class)
- 객체의 속성(필드), 기능(메서드)을 정의한 것(문서/설계도)
4. 객체 지향 언어의 특징
1) 추상화
2) 캡슐화
3) 상속
4) 다형성
<추상화>
- 구체적인 것을 제거하고, 공통적인 것만 남겨두는 것
→ 유연성 확보
<캡슐화>
1) 속성, 기능을 하나로 묶어서 관리
→ class{}
2) 데이터(속성 == 필드)의 직접 접근 제한 원칙
→ 필드에서는 private 접근 제한자를 붙임
→ 필드에 대한 간접 접근 방법(getter/setter) 제공
<객체 생성 메모리 구조>
(1) (3) (2)
Nation n2 = new Nation();
(1)
Stack 메모리 영역에 Nation 자료형 변수 n2를 선언
- Nation 자료형 변수 == Nation 객체를 참조하는 참조형 변수
(2)
Heap 메모리 영역에 Nation 클래스에 정의된 내용을 토대로 객체 생성(할당)
- new 연산자 : Heap 메모리 영역에 새로운 객체 생성
(3)
생성된 객체의 시작 주소를 n2 변수에 대입하여 참조할 수 있게 함
- n2 자료형 == Nation
- 생성된 객체 자료형 == Nation
→ 같은 자료형이므로 대입 가능
5. Object와 instance의 차이
ex) 현실의 존재하는 실제 물체를
객체 지향 언어를 이용해 코드로 작성해서
new 연산자를 통해 객체로 생성
-> 생성된 객체는 진짜 객체?? No!!!!!!!
현실에 존재하는 진짜 객체 : Object
컴퓨터에 생성된 객체 : Instance
(+ class 까지 묶어서 차이점 잘 구분하기)
<입금 출금기능 구현해보기>
[기능]
public class Account(
private String name; // 이름
private String accountNumber; // 계좌 번호
private long balance; // 잔액
private String password; // 비밀번호
/**
* 출금 기능
* @param pw : 전달 받은 비밀번호
* @param amount : 전달 받은 출금 금액
*/
public void withdraw(String pw, long amount) {
// 비밀번호가 일치하지 않을 떄
if(!password/equals(pw)){
System.out.println("비밀번호가 일치하지 않습니다");
return; // 메서드 종료
// 출금 금액이 잔액보다 큰 경우
if(amount > balance){
System.out.println("잔액이 부족합니다")
return;
}
// 잔액 - 출금 금액
balance -= amount;
System.out.println(amount + "원이 출금 되었습니다");
System.out.printf("%s님의 %s 계좌의 현재 잔액 : %d \n",
name, accountNumber, balance);
// getName()을 호출하면 String 자료형을 반환할거야!
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAccountNumber() {
return accountNumber;
}
public void setAccountNumber(String accountNumber) {
this.accountNumber = accountNumber;
}
public long getBalance() {
return balance;
}
public void setBalance(long balance) {
this.balance = balance;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
[실행]
package basic;
public class AccountTRun {
public static void main(String[] args) {
// Account 객체 생성
Account a1 = new Account();
// The field Account.name is not visible
// -> 캡슐화(private)로 인해 변수가 보이지 않아 오류
// a1.name = "홍길동";
// a1.accountNumber = "1234567890";
// a1.balance = 10000;
// a1.password = "1q2w3e4r";
// 간접 접근 기능을 이용해 세팅
a1.setName("홍길동");
a1.setAccountNumber("1234567890");
a1.setBalance(10000);
a1.setPassword("1q2w3e4r");
// a1 계좌의 잔액, 비밀번호 바꾸기
// System.out.println("a1 잔액 : " + a1.balance);
//
// a1.balance = 0; // 잔액을 0원으로 바꿔버림
// a1.password = "asdf1234";
// 간접 기능을 이용해 값 얻어오기
String name1 = a1.getName();
String accountNumber1 = a1.getAccountNumber();
long balance1 = a1.getBalance();
String password1 = a1.getPassword();
System.out.printf("%s / %s / %d / %s \n",
name1, accountNumber1, balance1, password1);
// 입금 기능 호출
a1.deposit(5000); // a1이 참조하는 계좌 잔액을 5000 추가
String a = "ABCD";
String b = new String("ABCD");
System.out.println(a); // ABCD
System.out.println(b); //ABCD
System.out.println(a == b); //false (동일비교)
System.out.println(a.equals( b)); //true (동등비교)
System.out.println("----------------------------------------");
System.out.println("[출금 기능]");
a1.withdraw("zxcvasdf", 2000000); // 비밀번호 불일치
a1.withdraw("1q2w3e4r", 2000000); // 잔액 부족
a1.withdraw("1q2w3e4r", 7000); // 출금 성공
a1.withdraw("1q2w3e4r", 8000); // 모두 출금
}
}
#결과

<변수(필드) 간접 접근 기능>
1. setter
변수에 값을 세팅(대입) 하는 기능
| public void set필드명(자료형 변수명){ this.필드명 = 변수명; } |
2. getter
변수의 값을 얻어가게 하는 기능
|
public 반환형 get필드명(){
return 필드명; |
'BackEnd > Java' 카테고리의 다른 글
| [Java]OOP_필드(Field) (1) | 2024.07.23 |
|---|---|
| [Java]OOP_클래스 (1) | 2024.07.23 |
| [Java]배열(Array) for문 (1) | 2024.07.21 |
| [Java]배열(Array) (0) | 2024.07.21 |
| [Java]Control 조건문(Loop2) (0) | 2024.07.21 |