middlefitting

[OOP] Java 클래스(Class)와 객체(Object) 알아보기 본문

JAVA

[OOP] Java 클래스(Class)와 객체(Object) 알아보기

middlefitting 2023. 2. 7. 23:55

객체지향 프로그래밍(OOP)에서는 이름값 하듯이 객체가 아주 중요합니다.

 

객체와 클래스라는 개념은 같이 따라오게 되는데요

 

클래스는 설계도, 객체는 설계도대로 만든 구현체(물건)입니다.

 

 

 

객체(Object)

클래스를 알아보기 전에 객체가 무엇인지 알아보겠습니다.

 

OOP에서 객체는 구현체, 실제로 존재하는 사물을 뜻하는데요,

 

속성(변수)과, 기능(메서드)를 가질 수 있습니다.

 

이것이 무슨 말일까요

 

 

객체는 속성을 가질 수 있다.

속성을 가진다는 것은 변수를 가질 수 있다는 것을 말합니다.

 

일단 변수로는 이러한 것들이 있겠습니다

String	name;
int	age;

여기서 보시면 int는 Java의 기본 자료형입니다.

 

그리고String은 기본 자료형이 아니죠. class 자료형입니다.

 

즉 객체는 속성으로 기본 자료형 뿐만 아니라 class 자료형도 속성으로 가질 수 있습니다.

 

 

객체는 기능을 가질 수 있다.

기능을 가진다는 것은 객체는 내부에 함수를 가질 수 있다는 것을 말합니다.

 

내부에 존재하는 함수를 메서드라고 표현하는데요,

 

'메서드는 함수이지만, 객체 내부에 존재하는 함수' 라고 이해하시면 될 것 같습니다.

 

 

 

객체에 대해 간단하게 알아보았는데요, 그렇다면 이러한 객체는 어떻게 만들수 있을까요.

 

속성과 기능을 객체를 만들때마다 일일이 정의해야 할까요.

 

그것은 매우 비효율적이니 무언가 객체를 찍어내줄수 있는 뭔가가 필요할 것 같은데요,

 

그래서 존재하는 것이 클래스입니다.

 

 

 

클래스(Class)

클래스란 설계도입니다.

 

설계도를 통해 해당 설계도의 내용을 가지는 객체를 찍어낼 수 있습니다.

 

아까 String class에 대한 내용이 잠깐 나왔는데요,

 

String class를 통해 만든 객체 == String 인스턴스입니다.

 

인스턴스라는 말은 특정 클래스의 객체를 표현하기 위해 사용합니다.

 

즉 String 클래스의 객체 == String 인스턴스 라고 표현하는 뉘양스 정도로 이해하시면 될 것 같습니다.

 

아까 객체는 속성과 기능을 가진다고 했는데요, class를 통해 이를 어떻게 설계할 수 있는지 간단한 코드를 보여드리겠습니다.

public class HelloClass {
    public String  message;

    public HelloClass() {
        this.message = "HelloClass!";
    }

    public void welcomeMessage() {
        System.out.println(this.message);
    }
}

 

아주 간단하게 클래스를 작성해 보았는데요,

 

HelloClass라는 class를 정의하였고 

 

그 내부에는 message라는 속성이 존재하고, welcomeMessage() 라는 메서드가 존재하는 것을 확인하실 수 있습니다.

 

따라서 HelloClass의 인스턴스들은 해당 내용들을 사용할 수 있게 되는 것입니다.

 

 

그렇다면 해당 클래스의 인스턴스를 어떻게 만들 수 있는지 알아보겠습니다.

public class HelloClass {
    String  message;

    public HelloClass() {
        this.message = "HelloClass!";
    }

    public void welcomeMessage() {
        System.out.println(this.message);
    }
}

class toPrint {
    public static void main(String[] args) {
    	// helloClass 참조변수에 new 연산자 및 HelloClass 생성자를 통해 인스턴스 주소저장
        HelloClass helloClass = new HelloClass();
        
        // welcomeMessage() 메소드 실행
        helloClass.welcomeMessage();
        // -> HelloClass!
        
        // 인스턴스 message 속성 변경
        helloClass.message = "GoodbyeClass!";
 		// 메서드 재실행
        helloClass.welcomeMessage();
        // -> GoodbyeClass!
    }
}

이렇게 main문 내부에서 HelloClass의 인스턴스를 생성하여 메소드를 실행할수도 있고, 속성도 변경하는 작업을 진행할 수 있습니다.

 

이렇게 객체는 속성과 메서드를 가지게 됩니다.

 

객체지향 프로그래밍은 말그대로 객체를 지향하는 프로그래밍입니다.

 

 

사실 해당 코드는 이렇게 진행할 수도 있겠습니다.

class toPrint {
    public static void main(String[] args) {
        String message = "HelloClass!";
        System.out.println(message);
        message = "GoodByeClass!";
        System.out.println(message);
    }
}

물론 지금과 같은 간단한 코드에서는 요렇게 진행을 해도 문제가 없지 않나 생각이 들수는 있겠습니다만

 

관련된 내용들을 묶어서 클래스를 만들고, 객체를 통해 프로그래밍을 진행하면 결국에는

 

유지보수, 재사용성 및 코드가 보기 좋아집니다.