JAVA/JAVA 기초

Java의 클래스(Class)와 객체(Object)

임베디드 친구 2024. 9. 28. 12:55
728x90
반응형

Java의 클래스(Class)와 객체(Object)

Java는 객체지향 프로그래밍(OOP, Object-Oriented Programming) 언어로, 객체라는 실체를 중심으로 프로그램을 설계하고 개발하는 방식입니다. 이 객체지향 개념에서 클래스(Class)객체(Object)는 핵심적인 요소입니다. 클래스는 객체를 생성하기 위한 설계도이자 청사진이며, 객체는 이 설계도로부터 생성된 실체입니다. 이러한 구조는 코드의 재사용성과 유지보수성을 높여줍니다.

본 글에서는 Java에서 클래스와 객체의 개념, 이 둘의 관계, 그리고 이를 활용한 객체지향 프로그래밍의 장점에 대해 설명합니다. 또한, 예제 코드와 함께 이러한 개념을 실질적으로 어떻게 적용할 수 있는지 알아보겠습니다.

1. 클래스(Class)

클래스는 객체를 정의하는 틀입니다. 클래스는 객체가 가져야 할 속성(attribute)과 동작(behavior)을 정의합니다. 즉, 객체를 생성하는 설계도 역할을 하며, 클래스를 사용하여 객체를 생성하고 그 객체가 어떠한 데이터를 가질지, 어떤 동작을 수행할지를 지정할 수 있습니다.

1.1 클래스의 기본 구조

클래스는 크게 멤버 변수(필드)메서드(함수)로 구성됩니다. 멤버 변수는 객체의 속성이나 상태를 저장하고, 메서드는 객체의 행동을 정의합니다. 이를 통해 클래스는 객체의 특성(속성)과 동작(행위)를 모두 설명할 수 있습니다.

public class Human {
    // 멤버 변수
    String name;
    String gender;
    boolean isRunning;

    // 생성자
    public Human(String name, String gender) {
        this.name = name;
        this.gender = gender;
        this.isRunning = false;
    }

    // 메서드: 이름을 반환
    public String getName() {
        return name;
    }

    // 메서드: 성별을 반환
    public String getGender() {
        return gender;
    }

    // 메서드: 달리기 시작
    public void run() {
        isRunning = true;
    }

    // 메서드: 현재 달리고 있는지 확인
    public boolean isRunning() {
        return isRunning;
    }
}

1.2 생성자(Constructor)

생성자는 클래스의 인스턴스(객체)가 생성될 때 호출되는 특별한 메서드입니다. 생성자는 클래스 이름과 동일한 이름을 가지며, 객체 생성 시에 필요한 초기화 작업을 수행합니다. 생성자는 객체의 멤버 변수를 초기화할 수 있으며, 클래스의 인스턴스를 생성하는 역할을 담당합니다.

// 생성자를 이용한 객체 생성
Human minHo = new Human("Kim MinHo", "male");

위 코드에서 new Human("Kim MinHo", "male")는 Human 클래스의 생성자를 호출하여 minHo라는 객체를 생성합니다. 생성자는 이름과 성별을 받아 객체를 초기화합니다.

1.3 접근 제어자

Java 클래스에서 멤버 변수와 메서드는 접근 제어자를 통해 접근 수준을 지정할 수 있습니다. 주로 사용되는 접근 제어자는 다음과 같습니다:

  • public: 모든 클래스에서 접근 가능.
  • private: 해당 클래스 내부에서만 접근 가능.
  • protected: 같은 패키지 또는 상속받은 클래스에서 접근 가능.
  • default(패키지-프라이빗): 같은 패키지 내에서만 접근 가능.

위의 Human 클래스에서, 예를 들어 name과 gender 변수를 외부에서 직접 수정하지 못하도록 보호하고 싶다면, 변수에 private 접근 제어자를 사용할 수 있습니다.

public class Human {
    // 멤버 변수를 private으로 선언하여 외부 접근 차단
    private String name;
    private String gender;
    private boolean isRunning;

    public Human(String name, String gender) {
        this.name = name;
        this.gender = gender;
        this.isRunning = false;
    }

    // Getter 메서드를 통해 외부에서 접근하도록 설정
    public String getName() {
        return name;
    }

    public String getGender() {
        return gender;
    }

    public void run() {
        isRunning = true;
    }

    public boolean isRunning() {
        return isRunning;
    }
}

이처럼 private로 선언된 멤버 변수는 외부에서 직접 접근할 수 없고, 대신 public 메서드를 통해 간접적으로 접근해야 합니다. 이를 통해 데이터 은닉화(data encapsulation)를 실현할 수 있습니다.

2. 객체(Object)

객체는 클래스에서 정의한 속성과 동작을 가지는 실체입니다. 다시 말해, 클래스는 객체를 만들기 위한 설계도라면, 객체는 그 설계도를 바탕으로 만들어진 실제 실체입니다. 객체는 메모리에 할당되며, 클래스에서 정의된 변수와 메서드를 통해 동작합니다.

2.1 객체의 특징

상태(State): 객체는 클래스에서 정의된 속성(멤버 변수)을 통해 고유한 상태를 가집니다.
행동(Behavior): 객체는 클래스에서 정의된 메서드를 호출하여 동작을 수행합니다.
식별자(Identity): 각 객체는 메모리상 고유한 위치에 존재하며, 서로 구분됩니다.

2.2 객체의 생성과 사용

객체는 클래스의 인스턴스이며, new 키워드를 사용하여 객체를 생성할 수 있습니다. 객체를 생성한 후에는 객체의 메서드를 호출하거나 속성에 접근하여 다양한 동작을 수행할 수 있습니다.

public class MainExample {
    public static void main(String[] args) {
        // Human 클래스의 객체 생성
        Human minHo = new Human("Kim MinHo", "male");

        // 객체의 메서드를 호출하여 동작을 수행
        minHo.run();

        // 객체의 상태 확인
        System.out.println("Is MinHo running?: " + minHo.isRunning());
    }
}

위 코드에서는 Human 클래스의 인스턴스인 minHo 객체를 생성한 후, run() 메서드를 호출하여 "달리기" 동작을 수행하고 있습니다. 그 후, isRunning() 메서드를 통해 현재 객체의 상태를 확인할 수 있습니다.

2.3 객체와 참조 변수

Java에서 객체는 참조 변수에 의해 다뤄집니다. 즉, 객체는 메모리의 특정 위치에 저장되고, 참조 변수는 그 위치를 가리킵니다. 아래 코드를 통해 참조 변수와 객체의 관계를 이해할 수 있습니다.

Human person1 = new Human("Alice", "female");
Human person2 = person1; // person1을 참조하는 새로운 참조 변수 person2

person2.run();
System.out.println("Is Alice running?: " + person1.isRunning()); // true 출력

위의 예제에서는 person1과 person2가 같은 객체를 참조하고 있습니다. 따라서 person2.run()을 호출하면 person1의 상태도 변경됩니다. 이는 두 변수가 같은 메모리 주소를 참조하고 있기 때문입니다.

3. 객체지향 프로그래밍의 장점

객체지향 프로그래밍(OOP)은 소프트웨어 개발에 많은 이점을 제공합니다. OOP에서 클래스와 객체를 활용하면 다음과 같은 장점을 누릴 수 있습니다.

3.1 코드의 재사용성

클래스는 재사용 가능한 코드 블록으로, 한 번 정의된 클래스를 여러 곳에서 사용할 수 있습니다. 코드의 중복을 줄이고, 유지보수를 용이하게 합니다.

Human person1 = new Human("Alice", "female");
Human person2 = new Human("Bob", "male"); // 동일한 Human 클래스를 사용

위의 예시처럼 동일한 클래스를 여러 객체에서 사용할 수 있으므로, 개발 시간과 노력을 줄일 수 있습니다.

3.2 코드의 유지보수성

객체지향 프로그래밍에서는 코드의 각 부분을 독립적으로 개발하고 테스트할 수 있어, 유지보수가 용이합니다. 특정 클래스의 내부 동작을 수정하더라도, 해당 클래스를 사용하는 다른 코드에는 영향을 주지 않으므로 코드의 안정성을 유지할 수 있습니다.

3.3 코드의 확장성

새로운 기능을 추가하거나 확장해야 할 때, 기존 클래스의 코드를 수정하지 않고도 새로운 클래스나 객체를 정의할 수 있습니다. 예를 들어, 상속을 통해 기존 클래스를 확장하여 새로운 기능을 추가할 수 있습니다.

public class Athlete extends Human {
    private String sport;

    public Athlete(String name, String gender, String sport) {
        super(name, gender); // 부모 클래스의 생성자 호출
        this.sport = sport;
    }

    public String getSport() {
        return sport;
    }
}

이렇게 상속을 사용하면 기존 Human 클래스의 기능을 확장한 새로운 Athlete 클래스를 정의할 수 있습니다.

4. 결론

Java의 클래스와 객체는 객체지향 프로그래밍의 핵심 요소로, 코드의 재사용성, 유지보수성, 확장성을 극대화하는 데 중요한 역할을 합니다. 클래스를 통해 객체의 속성과 동작을 정의하고, 객체를 생성하여 실질적인 동작을 수행할 수 있습니다. 이를 통해 복잡한 프로그램을 구조적으로 설계하고, 유지보수가 용이한 코드를 작성할 수 있습니다.
객체지향 프로그래밍을 올바르게 이해하고 활용하면 유연하고 확장 가능한 소프트웨어를 개발할 수 있습니다.

728x90
반응형

'JAVA > JAVA 기초' 카테고리의 다른 글

Java 메서드 오버로딩 (Method Overloading)  (0) 2024.09.30
Java 메서드(Method)  (0) 2024.09.29
Java 반복문  (0) 2024.09.27
Java에서 조건문(if, switch) 다루기  (0) 2024.09.26
Java 연산자 기초와 사용법  (0) 2024.09.25