Java_10) Class - 객체 (Object)
2025. 8. 27. 16:26

    <객체지향 프로그래밍>

**객체지향 프로그래밍(OOP, Object-Oriented Programming)**은 세상을 객체들의 상호작용으로 모델링하여 프로그램을 구성하는 설계 방식이다.

- 핵심 개념 정리

객체(Object): 현실에서 목적과 가치가 있어 논리적으로 식별 가능한 것

  • 예시: 사람, 자동차, 주문, 배송 등

클래스(Class): 객체를 만들기 위한 설계도

  • 필드(Field): 데이터를 저장하는 변수
  • 메서드(Method): 객체의 기능을 정의하는 함수

인스턴스(Instance): 클래스로부터 new 키워드를 통해 생성한 실제 메모리를 가지고 있는 객체

- 추상화 과정

추상화는 문제 해결에 필요한 속성과 기능만 걸러내서 단순화하는 과정이다.

  1. 구현하고자 하는 프로그램에서 필요한 객체 식별
  2. 객체들의 공통적인 속성, 기능 수집
  3. 프로그램 목적에 맞게 속성과 기능 선별
  4. 최종 속성들을 적절한 자료형과 변수명으로 정의

    <기본 클래스 구조와 객체 생성>

- 학생 클래스 예제

package com.kh.object.ex1;

public class Student {
    // 필드 영역: 사용할 데이터를 선언하는 영역
    String name;
    int age;
    double height;
    
    // 메서드 영역: 클래스의 기능을 정의하는 영역
    void myInfo() {
        System.out.printf("안녕하세요. 저는 %d살의 %s입니다.\n", age, name);
    }
}

- 객체 생성 및 활용

package com.kh.object.ex1;

public class Run {
    public static void main(String[] args) {
        // 클래스명 객체이름 -> 해당 클래스 타입의 참조변수 생성
        Student park;
        // 객체이름 = new 클래스명() -> 새로운 인스턴스 생성
        park = new Student();
        Student song = new Student();
        
        // 필드에 값 할당
        park.name = "박지연";
        park.age = 20;
        
        song.name = "송아영";
        song.age = 21;
        
        // 메서드 호출
        park.myInfo();
        song.myInfo();
        
        // 객체의 참조값 출력
        System.out.println(park);
        System.out.println(song);
    }
}

실행 결과:

안녕하세요. 저는 20살의 박지연입니다.
안녕하세요. 저는 21살의 송아영입니다.
com.kh.object.ex1.Student@15db9742
com.kh.object.ex1.Student@6d06d69c

<생성자와 this 키워드>

- 생성자의 개념

**생성자(Constructor)**는 필드를 초기화하기 위한 특수 목적의 메서드이다.

  • 클래스와 이름이 동일하며 반환타입이 없다
  • 기본 생성자는 개발자가 정의하지 않으면 컴파일러가 자동 생성한다
  • 생성자를 하나라도 정의하면 기본 생성자는 자동 생성되지 않는다

- 은행계좌 클래스 예제

package com.kh.object.ex2;

public class BankAccount {
    int balance;
    
    // 매개변수가 있는 생성자
    public BankAccount(int balance) {
        this.balance = balance; // this: 현재 인스턴스를 가리키는 키워드
    }
    
    // 입금 메서드
    void deposit(int amount) {
        balance += amount;
    }
    
    // 출금 메서드
    void withdraw(int amount) {
        balance -= amount;
    }
    
    // 잔액조회 메서드
    void checkMyBalance() {
        System.out.println("잔액 : " + balance);
    }
    
    // 계좌이체 메서드
    void transfer(BankAccount target, int amount) {
        balance -= amount;
        target.balance += amount;
    }
}

- 객체간 상호작용 예제

package com.kh.object.ex2;

public class Run {
    public static void main(String[] args) {
        BankAccount ac1 = new BankAccount(0);
        BankAccount ac2 = ac1; // 같은 객체를 참조
        
        ac1.deposit(5000);
        ac2.withdraw(1000);
        ac1.checkMyBalance(); // 결과: 4000원
        
        ac2 = new BankAccount(0); // 새로운 객체 생성
        ac2.deposit(5000);
        
        ac1.transfer(ac2, 1000); // 계좌이체
        ac1.checkMyBalance(); // ac1 잔액: 3000원
        ac2.checkMyBalance(); // ac2 잔액: 6000원
    }
}

실행 결과:

잔액 : 4000
잔액 : 3000
잔액 : 6000

    <메서드 오버로딩>

- 오버로딩 개념

**메서드 오버로딩(Method Overloading)**은 메서드 이름이 동일해도 매개변수의 타입, 개수, 순서에 따라 다른 메서드로 인식하는 기능이다.

- Math 클래스 오버로딩 예제

package com.kh.object.ex3;

public class Math {
    // 하나의 정수를 받아서 두 배로 만드는 메서드
    int adder(int n) {
        return n + n;
    }
    
    // 두 정수를 더하는 메서드
    int adder(int n1, int n2) {
        return n1 + n2;
    }
    
    // 두 실수를 더하는 메서드
    double adder(double n1, double n2) {
        return n1 + n2;
    }
    
    // 정수와 문자열을 합치는 메서드 (정수가 앞)
    String adder(int n1, String str) {
        String addResult = n1 + str;
        return addResult;
    }
    
    // 문자열과 정수를 합치는 메서드 (문자열이 앞)
    String adder(String str, int n1) {
        String addResult = n1 + str;
        return addResult;
    }
}

- 오버로딩 메서드 호출 예제

package com.kh.object.ex3;

public class Run {
    public static void main(String[] args) {
        Math m = new Math();
        
        System.out.println(m.adder(10, 20));      // int + int
        System.out.println(m.adder(20));          // int 하나
        System.out.println(m.adder(10.312, 20.235)); // double + double
        System.out.println(m.adder('a', 'b'));    // char는 int로 형변환
        System.out.println(m.adder(10, "살이다")); // int + String
    }
}

실행 결과:

30
40
30.547
195
10살이다

정리 및 요약

  1. 객체지향 프로그래밍은 현실 세계의 객체들을 프로그램으로 모델링하는 방식이다
  2. 클래스는 객체의 설계도이며, 인스턴스는 클래스로부터 생성된 실제 객체이다
  3. 생성자는 객체 생성 시 필드를 초기화하는 특수 메서드이다
  4. this 키워드는 현재 인스턴스를 참조할 때 사용한다
  5. 메서드 오버로딩을 통해 같은 이름의 메서드를 여러 개 정의할 수 있다

'Java' 카테고리의 다른 글

Java_12) Inheritance - 상속  (4) 2025.08.27
Java_11) Access Modifier, ObjectArray  (1) 2025.08.27
Java_09) Method  (4) 2025.08.27
Java_08) 다차원 배열  (6) 2025.08.26
Java_07) array - 배열  (1) 2025.08.26