본문 바로가기
프로그래밍 언어/Java

[Java] 객체 프로그래밍이란?

by 까망 하르방 2021. 2. 23.
반응형

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

좀 더 나은 프로그램을 만들기 위한 프로그래밍 패러다임으로 로직을

상태(state) 행위(behave)로 이루어진 객체로 만드는 것

객체 지향 프로그래밍은 좀 더 현실을 잘 반영하기 위한 노력의 산물 

객체 지향 프로그래밍에서 중요한 것은 연관된 메소드와 그 메소드가 사용하는 변수들을 분류하고 그룹핑하는 것

#목적: 재사용 / #형태: 변수 + 메소드

 

등장 배경

객체 지향 언어가 출현할 당시 가장 범용으로 사용되는 언어는 절차 지향 언어였습니다.

그리고 객체지향언어는 그런 절차 지향 언어의 단점을 보완하고자 등장하였습니다.

객체 지향 언어는 상속, 다형성, 객체, 캡슐화 등 소프트웨어 재사용을 위한 여러 장치를 내장하고 있습니다.

객체 지향 소프트웨어를 새로 만드는 경우 이미 만든 객체 지향 소프트웨어를 상속받거나 객체를 가져다 재사용할 수 있으며,

부분 수정을 통해 소프트웨어를 다시 만드는 부담을 대폭 줄일 수 있다. 즉, 소프트웨어의 생산성이 향상 됩니다.

 

현실세계를 반영한 모델링

과거에는 수학 계산이나 통계 처리를 하는 등 대체로 처리 과정이나 계산의 절차가 중요해

절차 지향 언어가 매우 적합하였지만,

요즘은 컴퓨터가 산업 전반에 활용됨에 따라 실세계에서 발생하는 일을 프로그래밍해야 할 일이 더욱 많아지게 되었습니다.

현실세계의 일을 일련의 절차로만 묘사하는 것이 그리 쉽지 않기에 

일과 관련된 많은 객체들의 상호 작용으로 묘사하고자 하여 등장한 것입니다.

예를 들어 게임의 경우 하나의 흐름도에 의해 진행되지 않습니다.

게임에 등장하는 각 요소인 인물, 무기, 배경 등이 각각 구성되며 사용자의 입력에 의해

이들이 상호 작용하면서 프로그램이 실행됩니다.

 

즉, 절차 지향 프로그래밍으로 구현할 때의 흐름도가 필요도 하지만

객체 관계도를 통해 객체를 모델링하고 객체들의 관계를 결정하고

이들의 상호 작용에 필요한 메소드와 필드를 설계 및 구현해야 합니다.

 

은닉화 & 캡슐화

부품화라고 하는 목표는 단순히 동일한 기능을 하는 메소드와 변수를 그룹핑한다고 달성되는 것은 아니다. 

제대로된 부품이라면 그것이 어떻게 만들어졌는지 모르는 사람도 그 부품을 사용하는 방법만 알면 쓸 수 있어야 한다. 

이를테면 모니터가 어떻게 동작하는지 몰라도 컴퓨터와 모니터를 연결하는 방법만 알면 화면을 표시 할 수 있는 것과 같은 이치다.

즉 내부의 동작 방법을 단단한 케이스 안으로 숨기고 사용자에게는 그 부품의 사용방법만을 노출하고 있는 것이다. 

 

좀 더 예를들면, TV, 스피커, 카메라, 휴대폰, 자판기 등 수많은 실세계의 객체들은 내부를 둘러싸고 있는 껍데기로 캡슐화되어 있다.

객체는 캡슐화가 기본 원칙이지만 외부와의 접속을 위해 몇 부분만을 공개 노출한다.

TV의 경우로 살펴보면 내부를 캡슐화하고 on/off 버튼, 밝기 조절, 채널 조절 버튼, 음량 조절 버튼 등이 노출된 것이다.

이러한 컨셉을 정보의 은닉화(Information Hiding) 또는 캡슐화(Encapsulation)라고 부른다. 

 

캡슐화의 목적은 객체 내 데이터에 대한 보안·보호·외부 접근 제한 등을 위한 것이다.

외부에서 클래스 내부의 데이터 접근을 금지하는 것을 정보 은닉화라고 합니다.

 

[예시 코드]

public class Main {
    public static void main(String[] args) {
        new Main().compare();
    }
    
    private void compare() {
        User a = new User("hsw");
        User b = new User("hsw");
        System.out.println("결과 : " + a.equals(b));
    }
    
    public class User{
        private String name;
        
        public User(String name) {
            this.name = new String(name);
        }
        
        public boolean equals(User other) {
            System.out.println("custom equals...........");
            return match(name, other.name);
        }
        
        private boolean match(String str1, String str2) {
            System.out.println("test1 : " + (str1 == str2));
            System.out.println("test2 : " + (str1.equals(str2))); // String 객체의 내장 메소드
            return str1 == str2 && str1.equals(str2);
        }
    }
}

문자열 비교로서 '==' 연산자를 시도했지만 원하는 결과가 나오지 않았다.

대신 equals()를 이용해서 원하는 결과를 얻을 수 있었다.

 

[예시 코드]

[객체에게 '작업'할 내용을 맡긴는 관점]

간단한 프로그램에서는 오히려 코드가 길어보이지만 프로그램이 복잡해지고 모델링에 따라 효과가 다릅니다.

public class SumMachine {
    public int makeSum(int start, int end) {
        
        int sum = 0;
        
        for(int i=start; i<=end; i++) {
            sum = sum + i;
        }
        
        return sum;
    }
    
    public static void main(String[] args) {

        SumMachine machine = new SumMachine();
        
        int result = machine.makeSum(1, 100);
        System.out.println("합 : " + result);
        
        System.out.println("sum is " + machine.makeSum(20, 200));

    }
}

반응형

'프로그래밍 언어 > Java' 카테고리의 다른 글

[Java] 기본 생성자 & 매개변수 생성자  (1) 2021.02.23
[Java] 생성자(Constructor)  (0) 2021.02.23
[Java] ArrayList  (0) 2021.02.23
[Java] main 함수  (0) 2021.02.23
[예제] Java 입출력 속도 비교  (0) 2021.02.18

댓글