본문으로 바로가기

1. 객체와 클래스

  • 현실 세상에서 객체설계도를 바탕으로 만들어집니다. (집을 만들기 위해서는 설계도를 보고 만듭니다.)
  • 자바에서의 설계도는 클래스입니다.
  • 인스턴스: 특정 클래스로부터 만들어진 객체입니다.
  • 인스턴스화: 클래스로부터 객체를 만드는 과정인스턴스화라고 합니다.

 

객체 지향 프로그래밍 개발의 단계

  1. 클래스 설계
  2. 설계된 클래스를 가지고 객체를 생성
  3. 생성된 객체들을 상호작용하여 완성된 프로그램 개발 완료

 

2. 클래스

클래스 선언

클래스 이름은 관례적으로 첫 자를 대문자로 작성합니다. (그 이후에는 낙타 표기법)

public class 클래스이름 {
    // 필드(속성)
    String 필드1;
    int 필드2;

    // 생성자 (기본 생성자)
    public 클래스이름() {
    }

    // 메소드(동작)
    void 메소드1() {
    }
    
    void 메소드2() {
    }
}

 

[클래스 예시]

public class Computer {

    // 필드 (고유 데이터)
    String adminName;
    String serialNumber;

    // 필드 (상태)
    boolean power;

    // 필드 (부품)
    Cpu cpu = new IntelCpu();
    Gpu gpu = new NvidiaGpu();
    Memory memory = new SamsungMemory();

    // 생성자(기본)
    public Computer() {
    }

    // 생성자
    public Computer(String adminName, String serialNumber) {
        this.adminName = adminName;
        this.serialNumber = serialNumber;
    }

    // 메소드
    void on() {
        System.out.println("power on");
        this.power = true;
    }

    void off() {
        System.out.println("power off");
        this.power = true;
    }

    int sum(int num1, int num2) {
        return num1 + num2;
    }
}

 

3. 클래스 구성 멤버

클래스 구성 멤버에는 필드(Field), 생성자(Constructor), 메소드(Method)가 있습니다.

 

1. 필드

  • 객체의 데이터(고유 특성)가 저장되는 곳
  • 객체의 고유 데이터, 부품 객체, 상태 정보를 저장
  • 선언 형태가 변수와 비슷하지만, 필드를 변수라고 부르지 않습니다.
public class 클래스 {
    // 필드
    String 필드1;
    int 필드2;
}

 

변수 vs 필드

변수: 생성자와 특정 메소드 내에서만 사용되고 생성자와 메소드가 실행 종료되면 자동 소멸

필드: 생성자와 메소드 전체에서 사용되며 객체가 소멸되지 않는 한 객체와 함께 존재

변수는 JVM 스택 영역의 프레임 내부 로컬 변수 스택에 생성되지만 필드는 메소드 영역에 생성됩니다.

 

Runtime Data Area

JVM이 운영체제에서 할당받은 메모리 영역

Runtime Data Area

 

2. 생성자

  • 객체 생성 시 초기화 역할 담당
  • 필드를 초기화하거나, 메소드를 호출해서 객체를 사용할 준비를 합니다.
  • 메소드와 비슷하게 생겼지만, 클래스 이름으로 되어 있고 리턴 타입이 없습니다.
public class 클래스 {
    // 생성자 (기본 생성자)
    public 클래스() {

    }
}

 

3. 메소드

  • 객체의 동작에 해당하는 실행 블록
  • 메소드는 필드를 읽고 수정하는 역할도 있지만, 다른 객체를 생성해서 다양한 기능을 수행하기도 합니다.
  • 메소드는 객체 간의 데이터 전달의 수단으로 사용됩니다. (객체 간 상호작용)
  • 매개 값을 받을 수 있고, 실행 후 어떤 값을 리턴할 수도 있습니다.
public class 클래스 {
    // 메소드(매개값x, 리턴값x)
    void 메소드1() {
        System.out.println("메소드 1");
    }
    
    // 메소드(매개값o, 리턴값o)
    int 메소드2(int 매개변수1, int 매개변수2) {
        return 매개변수1 + 매개변수2;    
    }
}

 

4. 클래스의 용도

1. 라이브러리 클래스

  • API: Application Program Interface
  • 개발에 유용한 여러 기능들을 모아놓은 클래스

 

2. 실행 클래스

  • public static void main(String[] args) { ... }
  • 실행 클래스는 프로그램의 실행 진입점인 main() 메소드를 제공하는 역할을 합니다.
  • 프로그램 전체에서 사용되는 클래스가 100개라면 99개는 라이브러리고 단 하나가 실행 클래스 

 

5. 객체 생성

  • new 연산자클래스 타입 변수(참조 변수)를 활용
  • new 연산자는 클래스로부터 객체를 생성시키는 연산자 (new 연산자 뒤에는 해당 클래스의 생성자을 선언 합니다.)
  • new 연산자는 힙 영역에 객체를 생성시킨 후, 객체의 주소를 리턴합니다. 
  • 객체의 주소를 참조 타입인 클래스 변수에 저장해두면, 변수를 통해 객체를 사용할 수 있습니다. ( dot "." 연산자 활용)
  • 같은 클래스로부터 생성되어도 각 객체는 고유 데이터를 가지면서 메모리에서 독립적으로 활동합니다.
// 1. 객체 생성
클래스 변수 = new 클래스생성자();

// 2. 객체 필드 및 메소드 접근
변수.필드;
변수.메소드();

 

예시

객체 참조 예시

[Person 클래스]

import java.time.LocalDate;

public class Person {
    String name;
    LocalDate birthDay;

    Person(String name, LocalDate birthDay) {
        this.name = name;
        this.birthDay = birthDay;
    }

    void personInfoPrint() {
        System.out.println("name: " + this.name);
        System.out.println("birthDay: " + this.birthDay);
    }
}

 

[실행 클래스]

import java.time.LocalDate;

public class Main {
    public static void main(String[] args) {
        // new 연산자와 생성자를 이용하여 Person 객체 생성
        Person person1 = new Person("veneas", LocalDate.now());
        Person person2 = new Person("kim", LocalDate.of(1990, 5, 20));

        // 객체의 메소드 활용
        person1.personInfoPrint();
        person2.personInfoPrint();
    }
}