객채지향 프로그래밍 OOP(Object Oriented Programming)의 정의 


객채지향은 현실을 “객채(Object)”들의 상호작용으로 구현한 프로그래밍 방법론입니다. 

 

객채지향의 장점으로는 세 가지를 꼽을 수 있습니다. 

 

첫째, 재사용성입니다. 

중복된 코드와 개념을 묶어 쉽게 재사용할 수 있습니다. 

 

둘째, 코드관리의 용이성입니다. 

코드변경 시 관리가 쉽습니다. 

 

셋째, 코드의 신뢰성이 높습니다. 

실수할 가능성이 줄어들고, 실수하더라도 빠르게 수정할 수 있습니다. 

 

 

객채(Object) 의 정의 


이러한 장점을 가진 객채지향 방법론으로 우리의 코드를 설계하려면, 가장 중요한 개념인 객체에 대해 알아야 합니다. 

 

객체란, 보통 현실의 사물을 속성(Variable)기능(Method)으로 묘사한 프로그래밍에 쓰이는 가상의 사물입니다. 

 

이 말을 좀 더 쉽게 이해하기 위해서, 자동차에 대한 예시를 통해 현실 사물이 어떻게 객체가 되는지 쉽게 묘사해 봅시다. 

 

"자동차" 라는 물건은 여러 속성(특징)을 가지고 있습니다. 

 

주인이 붙여준 이름이 있을 것이고, 차의 브랜드가 있을 것이고, 차주의 이름, 차의 색깔도 있겠군요. 

 

"자동차"의 기능은 어떤가요? 

 

자동차는 "도로를 달리고", 좋은 자동차라면 "자동주행 기능을 켜고", 브레이크로 "멈춰서고", "주차하고".. 

 

다 나열하기 힘들 정도로 수많은 기능이 있겠군요. 

 

이렇듯이 자동차를 "속성"과 "기능"으로 단순화해서 바라보면 "객채" 가 됩니다. 

 

이런 객채들을 활용하여 프로그램을 만들어 보는 것이 객채지향 프로그래밍입니다. 

 

객채지향 설계의 장점 실습해보기


그렇다면 객체 지향적인 설계와 비객채지향적 설계의 차이점은 무엇일까요? 

 

먼저 자동차를 타고 달리고, 자동주행하고, 멈춰서고, 주차하는 현실의 행위를 Java 코드로 구현해봅시다. 

 

// 서울에서 차를 타고 달리는 상황을 가정하여, 이름을 
// DriveCarInSeoul로 지어봅시다. 
public class DriveCarInSeoul {
 
 	//main이라고 하는 메서드를 통해서 상황을 실행시켜 볼 수 있습니다.
 	public static void main(String[] args) {
    	
            // 자동차의 속성(특징) 묘사하는 변수를 만듭니다.
            // 이름, 브랜드, 주인, 색깔.. 원하는 속성(특징)은 몇 개든 묘사할 수 있습니다!
            String name = "부릉이"; 
            String brand = "현대자동차";
            String owner = "고길동"; 
            String color = "빨간색"; 
            ...

            // 자동차의 기능을 묘사하는 메서드를 만듭니다.
            // 달린다, 자동주행, 멈춰선다, 주차한다, 원하는 기능은 몇 개든 묘사할 수 있습니다!!

            // 앞서 만든 특징들을 활용하여 달리는 상황을 묘사할 수 있습니다. 
            // 어떤 주인이 무슨 브랜드의 차를 모는지를 묘사합니다. 
            System.out.println(owner + "drives" + brand); 


            // 이 기능은 오토파일럿 기능이 실행됨을 묘사합니다.
            System.out.println(name + " autopilot activated"); 

            // 이 기능은 차의 색깔과 차가 멈추었다는 것을 묘사합니다. 
            System.out.println(color + " car stopped"); 


            // 이 기능은 차가 주차되었음을 묘사합니다.
            System.out.println(name + " car parked"); 
    	}
 
}

 

 

이제 여러분은 Java라는 언어로, 서울에서 차를 모는 과정을 멋지게 시뮬레이션 할 수 있습니다!

 

그런데, 차는 서울에서만 몰 수 있을까요? 부산, 강릉, 광주, 춘천.. 어디든 갈 수 있죠.

 

이번에는 부산에서도 차를 몰아봅시다. 역시 차는 달리고, 자동주행하고, 멈춰서고, 주차합니다. 

 

// 이름을 DriveCarInBusan으로 짓는다면 부산에서 차를 모는 과정을 
// 시뮬레이션 할 수 있습니다.

public class DriveCarInBusan {
 
 	//main이라고 하는 메서드를 통해서 상황을 실행시켜 볼 수 있습니다.
 	public static void main(String[] args) {
    	
        	// 자동차의 속성을 먼저 묘사합니다.
            String name = "부릉이"; 
            String brand = "현대자동차";
            String owner = "고길동"; 
            String color = "빨간색"; 
            
            // 이후 자동차가 달리고, 자동주행하고, 멈추고, 주차하는 과정을 묘사합니다.
            System.out.println(owner + "drives" + brand); 
            System.out.println(name + " autopilot activated"); 
            System.out.println(color + " car stopped"); 
            System.out.println(name + " car parked"); 
    	}
 
}

 

아주 간단하게, 우리는 성공적으로 차를 몰고, 부산에서 달리고, 자동주행하고, 멈추고, 주차에 성공했습니다!

 

그런데 하필, 차 주인인 고길동 아저씨가 이번에는 한국의 모든 도시를 돌아보고 싶다고 말하는군요. 

 

시군구의 "시"만  포함하더라도 80개가 넘으니, 80번 넘게 제일 위쪽의 이름을 바꿔  그 안에 같은 코드를 열심히 붙여넣어야 끝납니다.

 

이번에는 80개의 도시를 "파란색" 차로 돌아보고 싶다고 말하는군요. 

 

80개의 도시 이름을 일일히 찾아서, 모든 차의 color 변수를 "파란색" 으로 바꿔줘야 합니다. 

 

심지어 아저씨는 멋지게 "드리프트" 하는 기능도 익혔습니다, 이제 차는 달리고, 자동주행하고, 드리프트하고, 멈추고, 주차합니다! 

 

또 80개를 일일히 찾아서, "드리프트" 기능을 넣어주면 되겠군요. 

 

어찌저찌 80개를 열심히 수정해서 끝냈다고 칩시다, 이제는 해외 도시를 "붕붕이"라는 차로 돌아보고 싶다고 한다면 어떨까요? 

 

해외의 도시는 1만개가 넘으니, "붕붕이"로 바뀐 코드를 열심히 1만번 붙여넣으면 됩니다! 

 

이 다음 한번이라도 더 이름을 바꾼다면 아마 손가락이 먼저 부러질 것 같네요. 

 

 

그럼 우리의 손가락이 부러지기 전에, 이 자동차"속성"과 "기능"을 빼내서 가상의 "객채"로 묶어봅시다.

 

		
        // Car 라고 하는 "객채"로 속성과 기능을 묶었습니다.
        public Class Car() {
        
            // 자동차의 속성을 묘사합니다.
            String name = "부릉이"; 
            String brand = "현대자동차";
            String owner = "고길동"; 
            String color = "빨간색"; 
            
            // 이후 자동차가 달리고, 자동주행하고, 멈추고, 주차하는 과정을 묘사합니다.
            public void driveTheCar() {
            System.out.println(owner + "drives" + brand); 
            System.out.println(name + " autopilot activated"); 
            System.out.println(color + " car stopped"); 
            System.out.println(name + " car parked"); 
            }
    	}

 

이렇게 하면 안에 있는 "속성"과 "기능"을 붙여넣을 필요 없이, 이 "자동차"를 부르기만 하면 됩니다.

 

// 이제 서울부터 뉴욕까지, 같은 자동차로 언제나 달릴 수 있습니다.

// 서울에서,
public class DriveCarInSeoul {
	public static void main(String[] args) {
	Car car = new Car(); 
    car.driveTheCar();
    }
}

// 부산에서, 
public class DriveCarInBusan {
	public static void main(String[] args) {
	Car car = new Car(); 
    car.driveTheCar();
    }
} 
// 인천에서,
public class DriveCarInIncheon {
	public static void main(String[] args) {
	Car car = new Car(); 
    car.driveTheCar();
    }
} 
// 춘천에서,
public class DriveCarInChunCheon {
	public static void main(String[] args) {
	Car car = new Car(); 
    car.driveTheCar();
    }

} 
// 도쿄에서, 
public class DriveCarInTokyo {
	public static void main(String[] args) {
	Car car = new Car(); 
    car.driveTheCar();
    }
} 
// 나가사키에서,
public class DriveCarInNagasaki {
	public static void main(String[] args) {
	Car car = new Car(); 
    car.driveTheCar();
    }
} 
// 뉴욕에서,
public class DriveCarInNewYork {
	public static void main(String[] args) {
	Car car = new Car(); 
    car.driveTheCar();
    }
}

... (생략)

 

이제 훨씬 더 간결한 코드 몇줄만으로도 우리가 만든 멋진 차의 "속성"과 "기능"을 그대로 다시 사용할 수 있습니다.

 

이처럼 객채지향적 코드는 재사용성이 뛰어납니다.

 

또, 차의 색깔이 바뀌더라도 1만번 다시 붙여넣는 대신 단 한번, Car이라는 객체의 color를 바꿔주면 됩니다. 

 

코드를 고치거나 바꾸는 유지보수도 용이합니다.

 

졸다가 두 번 붙여넣는다 해도 걱정없습니다, 1만 개의 코드를 다 점검할 필요 없이 하나의 "객체"에 두 번 들어갔는지만 확인하면 됩니다. 

 

오탈자의 위험성도 낮아지고, 구현된 기능에 대한 신뢰성이 높은 코드가 되었습니다. 

 

 

 

이처럼 객체지향 언어는 그 뛰어난 재사용성, 유지보수 용이성, 신뢰성으로 현재 널리 쓰이는 대표적인 프로그래밍 언어가 되었습니다. 

 

Java 코드를 해석하고 구현할 때, 이 세 가지 장점들을 고려하면서 구현한다면 

 

훨씬 빠르고, 쉽게 고칠 수 있고, 믿음직한 코드가 될 것입니다. 

 

Java 언어로 코드를 구현할 때는 이런 객채지향 언어의 장점을 고려하여 자신의 코드를 구현해 보시기를 바랍니다.

 

+ Recent posts