Minwoo Dev.

[Java] 클래스와 객체, 객체지향 프로그래밍(OOP) - 예시 본문

Java

[Java] 클래스와 객체, 객체지향 프로그래밍(OOP) - 예시

itisminu 2024. 3. 24. 12:11
728x90
반응형
SMALL

Java 는 기본적으로 객체지향 프로그래밍 언어이다.

 

객체지향 프로그래밍(OOP, Object-Oriented Programming)

클래스라는 묶음 안에 해당 프로그램의 속성(변수)와 기능(함수)를 넣어두고 사용하는 프로그래밍 방식이다.

 

강아지라는 동물에 대해서 특징을 생각해 보자.

속성, 즉 수치로 나타낼 수 있는 값은 키, 배고픈 정도, 이름 등등이 있을 것이고,

할 수 있는 행동(기능)은 짖기, 소개하기, 밥달라하기가 있을 것이다.

 

아래 코드를 보자, 우리가 기본적으로 사용하는 방식인 절차지향 프로그래밍이다.

 

 

package test;

public class DogWithoutOop {
    public static void main(String[] args) {
        int height = 50;
        String name = "비누";
        int hungryPercent = 70;

        bark();

        introduce(name,height,hungryPercent);

        if(hungryPercent>60){
            SayGiveMeFood(name,hungryPercent);
        }

    }

    static void bark(){
        System.out.println("멍멍!!!!");
    }
    static void SayGiveMeFood(String name, int hungryPercent){
        System.out.println(name+" 밥줘 주인!!!");
        System.out.println("히힛 배불러~");
        hungryPercent-=40;
    }

    static void introduce(String name,int height, int hungryPercent){
        System.out.println("내 이름은 "+ name+"이야."+" 난 강아지고 키가 "+height+" 이야!! 크지!? 히히");
        System.out.println("그리고 지금 얼마나 배고프냐면 "+hungryPercent+" % 정도니까 기억해놔.");
    }

}

 

 

위 코드에서는 키, 이름, 배고픈 정도를 각각 height, name, hungryPercent로 나타내었고,

짖기를 bark(), 밥 달라고 하기를 SayGiveMeFood()로, 소개하기를 introduce()로 구현하였다.

 

 

위 코드는 순서대로 할 일을 작성한 절차지향 방식의 코드이다. 보통 저렇게 작성하진 않았는가 ??

 

코드를 작성하기는 편리하지만, 강아지가 하는 일이 여기저기 널부러져 있는 느낌이 든다.

 

이러한 코드를 강아지라는 클래스 속에 모두 집어넣는 것이 객체지향 프로그래밍이다.

아래 코드를 보자.

package test;

public class Dog {
    int height;
    String name;
    int hungryPercent;

    void bark(){
        System.out.println("멍멍!!!!");
    }
    void SayGiveMeFood(){
        System.out.println(name+" 밥줘 주인!!!");
        System.out.println("히힛 배불러~");
        hungryPercent-=40;
    }

    void introduce(){
        System.out.println("내 이름은 "+ name+"이야."+" 난 강아지고 키가 "+height+" 이야!! 크지!? 히히");
        System.out.println("그리고 지금 얼마나 배고프냐면 "+hungryPercent+" % 정도니까 기억해놔.");
    }
}

 

Dog 라는 클래스에 속성들을 넣고, 함수도 바로 안에 기입했다.

클래스 안에 함수가 존재하므로, 인자로 height, name, hungryPercent를 받아올 필요가 없기때문에 함수(메서드)의 매개변수로 아무것도 들어있지 않은 것을 확인할 수 있다.

 

이제 위 클래스를 사용하는 것을 보이겠다.

DogMain이라는 하나의 파일을 만들고, main 안에서 실행하겠다.

package test;

public class DogMain {
    public static void main(String[] args) {
        Dog binu = new Dog();
        binu.name = "비누";
        binu.height = 50;
        binu.hungryPercent = 70;

        binu.bark();
        binu.introduce();
        binu.SayGiveMeFood();
    }
}

 

위처럼 클래스로 만든 객체를 사용하기 위해서는 . 을 이용하여 데이터에 접근한다.

Dog라는 클래스로 binu라는 객체를 찍어내고, 그 객체의 name 값에 접근하여 "비누"라는 값을 저장하는 셈이다.

 

위 코드를 실행한다면 아래와 가은 결과가 나온다.

 

절차지향 프로그래밍 방식과 결과가 동일한 것을 확인할 수 있다.

 

그리고 코드가 훨씬 간결하고 정리된 모습이다.

 

binu.name = "비누";
binu.height = 50;
binu.hungryPercent = 70;

 위 부분은 Dog 클래스를 사용하여 binu라는 객체를 찍어내고, 그 binu라는 객체의 name, height, hungryPercent를 정의해주는 모습이다.

 

매번 저렇게 객체를 생성하고 정의해준다면 꽤나 골치아플 것이다.

 

좀 더 간결하게 바꿀 수 있는 방법에 대하여 설명하겠다.

 

Init함수로 초기화하기

객체의 각 값들을 초기화해주는 함수를 하나 더 만들어주는 방법이다.

Dog 클래스로 가보자.

 

void Init(String name,int height, int hungryPercent){
        this.height = height;
        this.name = name;
        this.hungryPercent = hungryPercent;
    }

위와 같이 각 객체의 값들에 대하여 초기화를 진행해주는 함수를 Dog 클래스에 넣는 것이다.

 

 

package test;

public class Dog {
    int height;
    String name;
    int hungryPercent;

    void Init(String name,int height, int hungryPercent){
        this.height = height;
        this.name = name;
        this.hungryPercent = hungryPercent;
    }

    void bark(){
        System.out.println("멍멍!!!!");
    }
    void SayGiveMeFood(){
        System.out.println(name+" 밥줘 주인!!!");
        System.out.println("히힛 배불러~");
        hungryPercent-=40;
    }

    void introduce(){
        System.out.println("내 이름은 "+ name+"이야."+" 난 강아지고 키가 "+height+" 이야!! 크지!? 히히");
        System.out.println("그리고 지금 얼마나 배고프냐면 "+hungryPercent+" % 정도니까 기억해놔.");
    }
}

 

그리고 나서 DogMain에서 Init함수를 사용하여 초기화를 진행하겠다.

package test;

public class DogMain {
    public static void main(String[] args) {
        Dog binu = new Dog();
        binu.Init("비누",50,70);
        // binu.name = "비누";
        // binu.height = 50;
        // binu.hungryPercent = 70;

        binu.bark();
        binu.introduce();
        binu.SayGiveMeFood();
    }
}

 

총 3줄에 걸쳐 초기화했던 부분이 단 한줄로 초기화되는 것을 확인할 수 있다.

 

하지만, 이런 init 함수도 객체를 여러 개 생성한다면 여러 번 init()을 호출해야하는 단점이 존재한다.

자동적으로 객체가 생성될 때 초기화가 되게 하는 방법이 있을까 ?

 

그렇게 나온 것이 생성자이다.

 

 

생성자(Constructor)

생성자는 객체의 생성과 동시에 한번 호출된다.

 

 Dog(String name, int height, int hungryPercent){
        this.height = height;
        this.name = name;
        this.hungryPercent = hungryPercent;
    }

 

위 코드처럼 클래스 이름과 동일하게 작성해야한다.

 

함수의 반환형은 사용하지 않아도 된다.

 

package test;

public class Dog {
    int height;
    String name;
    int hungryPercent;

    Dog(String name, int height, int hungryPercent){
        this.height = height;
        this.name = name;
        this.hungryPercent = hungryPercent;
    }
    /*
    void Init(String name,int height, int hungryPercent){
        this.height = height;
        this.name = name;
        this.hungryPercent = hungryPercent;
    }
    */

    void bark(){
        System.out.println("멍멍!!!!");
    }
    void SayGiveMeFood(){
        System.out.println(name+" 밥줘 주인!!!");
        System.out.println("히힛 배불러~");
        hungryPercent-=40;
    }

    void introduce(){
        System.out.println("내 이름은 "+ name+"이야."+" 난 강아지고 키가 "+height+" 이야!! 크지!? 히히");
        System.out.println("그리고 지금 얼마나 배고프냐면 "+hungryPercent+" % 정도니까 기억해놔.");
    }
}

 

위처럼 적고, DogMain 함수에서 사용해보겠다.

package test;

public class DogMain {
    public static void main(String[] args) {
        Dog binu = new Dog("비누",50,70);
//        binu.Init("비누",50,70);

//        binu.name = "비누";
//        binu.height = 50;
//        binu.hungryPercent = 70;

        binu.bark();
        binu.introduce();
        binu.SayGiveMeFood();
    }
}

 

생성자를 사용하면 객체를 생성할 때 바로 초기값을 저렇게 넣어줘야한다.

코드가 훨씬 간결해졌다.

 

이처럼 객체지향 프로그래밍 방식을 사용한다면 사물이나 사람이 직접 일을 하는것처럼 하나의 객체로 묶어 데이터와 기능을 관리하기 쉬워진다.

 

728x90
반응형
LIST