BackEnd/Java

[Java]객체지향언어(OOP) 정의 및 Account

Hojung7 2024. 7. 23. 12:19

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