현 블로그는 모바일 환경이 아닌 PC환경에 최적화 되어있습니다.

 Mir의 운영환경


자 여태껏 우리가 배운 모든것이 모두 클래스의 기본구조이다.


변수를 저장하는 방법과 저장하는 방법중 하나인 배열을 배웠었고
함수를 만드는 방법으로 반복문과 조건문을 배워보았다.
그리고 그 변수와 함수를 합쳐서 하나의 클래스를 만들었었다.
지금까지의 예제를 보면 모두 하나의 클래스로 만들어진것을 확인할수 있다.


필자가 처음 클래스에 대해 설명할때 클래스란

함수에서 값을 계산하여 변수로 값을 저장하거나

아니면 변수에서 값을 가져와서 함수로 계산하는것이라고 설명하였다.

 
자 그럼 이제 시야를 클래스보다 좀 더 넓혀서 보도록 하자.

흔히 자바를 객체지향언어라고 말한다.

자 그럼 객체지향이란 무엇을 뜻할까?

깊게 들어가면 정말 따로 공부할만큼 공부해야지 되는것이 객체지향이다.
그러니 너무 깊게 들어가지 말고 간단한 개념으로만 알고 있자.


객체지향이란 세상의 모든 것을 객체화 한다는 것이다.


예를 들어 지갑을 객체화 해보자.

객체라는 것은 속성과 기능을 가지게 된다. 그럼 지갑에는 어떤 속성과 어떤 기능이 있을까?
지갑속에 돈이 있다면 돈이라는 속성과 돈을 꺼낸다 & 돈을 넣는다라는 기능이 생겨난다.
또한 지갑에 명함이 있다면 명함이란 속성과 명함을 꺼낸다 & 명함을 보관한다라는 기능이 생겨난다.

이렇게 우리가 흔히 볼수 있는 모든 물건 혹은 개념을 객체화 시킬려고 노력하는 것이 객체지향이라고 볼수 있다.
솔직히 필자도 위의 말이 정확한 답이라고 말할수가 없다.
다만 객체지향이란 것의 개념을 간단하게만 적어본것이지 저게 완벽한 객체지향의 개념이라고 말하기도 좀 그렇다.
정말 자세하게 알고 싶으신분들은 따로 공부를 하기 바란다.


그럼 객체지향언어의 장점은 무엇일까?


바로 재사용성과 유지보수의 용이함이다.
하나의 객체를 만들어 놓으면(프로그래밍 하면) 여러 프로그램에서 사용할수 있는것이다.
예를들어 숫자의 합계와 평균을 구하는 객체를 만들어 놓으면
가계부프로그램, 학점관리프로그램, 통계프로그램 등등 여러 프로그램에서 사용할수 있듯이
하나의 객체를 여러 방도로 활용할수 있다는게 제일 큰 장점이다.

우리가 지갑을 가지고 명함도 교환하고 먹을것도 살수 있고 혹은 지갑을 던져서 누굴 맞출수도 있듯이
하나의 객체를 만들고 난뒤 그것을 어떻게 활용하나에 따라 결과물이 바뀔수도 있는것이다. 


이외에 객체지향언어의 장점으로 은닉화, 상속성, 다형성 등등 많은 특성이 있지만
복잡하게 생각할 필요없이 하나의 객체를 여러형태로 사용할수 있다는것만 알아두자.




클래스와 객체의 정의와 용도

자 그럼 객체와 클래스에 대해 좀더 자세히 알아보자. 우선 객체! 
객체의 정의  :  실제로 존재하는 것, 사물 또는 개념.
객체의 용도  :  객체가 가지고 있는 기능과 속성에 따라 다름.

유형의 객체  :  책상, 의자, 자동차등과 같은 사물.
무형의 객체  :  수학공식, 프로그램 에러와 같은 논리나 개념.
    -출처 자바의 정석 
객체의 사전적인 정의는, '실제로 존재하는 것'이지만 객체지향이론에서는
위와같이 무형의 개념이나 논리들도 하나의 객체로 본다.

객체와 클래스의 관계는 설계도와 완성품이라고 생각하면 될것이다.
클래스는 "객체의 설계도 또는 틀"이라고 정의할수 있다.

자 예를 들어 TV설계도(클래스)는 TV(객체)를 정의 한것이며 TV(객체)를 만들때 사용된다.
우리가 TV를 볼려고 할때에는 TV(객체)가 필요한것이지 TV설계도(클래스)가 필요한것이 아니다.
TV설계도(클래스)는 TV(객체)를 만들때에만 사용하는 것이며 TV(객체)는 TV설계도(클래스)가 있어야지만 만들수 있다.
(즉 클래스는 객체를 정의한 것이며 객체를 만들때 사용된다.
  클래스는 객체를 만들때에만 사용하는 것이며 객체는 클래스가 있어야지만 만들수 있다.)




클래스의 설계와 기능 
 

아직 조금 헷갈리는 사람을 위해 우선 클래스를 한번 만들어보자. (객체를 만들려면 우선 클래스가 필요하다고 말했었다.)

class AddHap { }

 
그뒤에 클래스 안에 합계를 할 두 변수 a와 b를 선언하고 그 합계를 저장할 hap이라는 변수를 선언해보자.

class AddHap {

int a ;

int b ;

int hap;


}


그리고 난뒤 a와 b의 합을 구하는 메소드를 만들어보자.

class AddHap {

int a ;

int b ;

int hap;

void hap(){

hap = a + b;

}

}

AddHap클래스를 자세히 살펴보면
변수 a와 b를 가지고 합계를 구하는 함수 hap()을 가지고 있고
메소드 hap( )으로 합계를 구한 값을 저장시킬 변수 hap을 가지고 있다.

위에서 말한 클래스의
함수에서 값을 계산하여 변수로 저장시키거나
변수에서 값을 가져와서 함수로 계산하는 두가지 기능을 모두 포함
하고 있는것이다.

클래스는 이렇게 데이터(변수)와 처리동작(Method)를 하나로 모아놓은것이며
클래스내의 데이터와 처리동작을 합쳐서 맴버라고 한다. 

a,b,hap과 같이 값을 저장할수 있는 변수를 
객체의 속성, 맴버변수, 특성, 필드, 상태등으로 불리우며
hap ( )과 같이 값을 계산할수 있는 함수를 
객체의 기능, Method, 행위, 맴버함수등으로 불리운다.
(필자는 앞으로 맴버변수와 Method라는 용어를 사용하겠다.)

자 위의 예제처럼 변수와 Method를 모아논 클래스를 만들었다고 바로 사용할수는 없다.
위에서 말했듯이 클래스는 하나의 설계도 일뿐 TV설계도만으로 TV를 볼수 없듯
클래스만으로는 그 기능을 사용할수 없는것이다.
(여태껏 우리가 만든 클래스는 클래스 안에 main( )메소드가 있어서 바로 실행이 가능했지만
  위 클래스는 자세히보면 main( )메소드가 클래스 내에 없다.)
 


자 위그림은 클래스와 객체의 차이를 간단히 보여주는 그림이다.
AddHap이라는 클래스(설계도)를 가지고 AddHap에 있는 맴버변수와 Method를 사용할수 있도록
메모리 위에 공간을 만들어 hap1이라는 객체를 만들었다.
TV설계도가 있으면 TV를 몇개씩 만들수 있는것 처럼 하나의 클래스로 여러개의 객체를 만들어 낼수 있다.
그렇게 여러개 만든 객체는 위 그림에서 보듯이 각각 자기만의 저장공간을 가지게 된다.



클래스의 객체화와 사용


클래스를 가지고 객체를 생성하는 과정을 객체화(인스턴스화, 오브젝트화 명칭이 많다;;)라고 하며

클래스명 변수명;
변수명 = new 클래스명();

이라는 공식으로 객체를 생성하며 줄여서

클래스명 변수명 = new 클래스명();

으로 사용가능하다.

자 그럼 위에 만든 AddHap이라는 클래스를 가지고 객체를 한번 생성해보자.

class AddHap {

int a ;

int b ;

int hap;

void hap(){

hap = a + b;

}

}


class Hap{

public static void main(String[] args){

AddHap hap = new AddHap();

hap.a = 1;

hap.b = 2;

hap.hap();

System.out.println(hap.hap);

}

}

Hap라는 클래스 안에 AddHap클래스의 참조변수 hap을 생성하고난뒤 객체를 생성하였다.

이 클래스 Hap이 어떻게 실행되는지 알아보자.
(아래그림을 클릭하세요)

객체와 참조변수의 관계는 우리가 일상생활에서 사용하는 리모컨과 TV의 관계와 비슷하다.
리모컨(참조변수)를 사용하여 TV(객체)를 다루기 때문이다.


조금 정리를 해보자.
(지금 필자가 적어놓고 왠지 헷갈린다;;)

TV를 만들려고 하면 설계도가 필요하다.
설계도는 클래스이며 TV는 객체이다.
TV의 설계도를 다 작성하고 이제 조립하는것이 객체화이다.
객체화 시킨 TV의 속성과 기능은 클래스내의 변수와 함수이다.
이 객체화시킨 TV의 속성과 기능을 사용할려면 리모컨(참조변수)이 필요하다.

조금은 개념이 정리가 되었으면 한다.



자 그럼 조금 더 들어가서 객체를 사용하여 사원들의 월급명세서를 출력하는 프로그램을 짜보도록 하자.
우선 사원의 이름과 월급을 저장할 공간을 선언해주었다.

class Pay{

String name;

int bonbong;


그리고 난뒤에 각종세금을 구하는 메소드와 세금을 뺀 나머지 실수령액을 구하는 메소드를 넣어보자.

class Pay{

String name;

int bonbong;

int tex;

int silsu;

void setTex(){

tex = (int)(bonbong * 0.045 + 0.5);

}

void setSilsu(){

silsu = bonbong - tex;

}

}


이렇게 되면 사원이 이름과 월급만 가지고도 세금과 세금을 제외한 실수령액을 구할수 있다.
자 여기서 하나의 메소드를 더 추가해보자.

class Pay{

String name;

int bonbong;

int tex;

int silsu;

void setTex(){

tex = (int)(bonbong * 0.045 + 0.5);

}

void setSilsu(){

silsu = bonbong - tex;

}

void printPay(){

System.out.println("성명 : " + name);

System.out.println("봉급 : " + bonbong);

System.out.println("세금 : " + tex);

System.out.println("실수령액 : " + silsu);

}

}

하나하나 출력하기 귀찮아서 한꺼번에 출력시키는 기능을 가진 printPay메소드를 만들어 보았다.

그럼 Pay클래스를 이용하여 사원들의 월급을 한번 출력해보자.

public class PayCalc {

public static void main(String[] args){

Pay p1 = new Pay();

Pay p2 = new Pay();

Pay p3 = new Pay();

p1.bonbong = 10000000;

p1.name = "미르";

p1.setTex();

p1.setSilsu();

p1.printPay();

p2.bonbong = 2000000;

p2.name = "사원";

p2.setTex();

p2.setSilsu();

p2.printPay();

p3.bonbong = 3000000;

p3.name = "팀장";

p3.setTex();

p3.setSilsu();

p3.printPay();

}

}


출력값

성명 : 미르

봉급 : 10000000

세금 : 450000

실수령액 : 9550000

성명 : 사원

봉급 : 2000000

세금 : 90000

실수령액 : 1910000

성명 : 팀장

봉급 : 3000000

세금 : 135000

실수령액 : 2865000

 클래스를 객체화 시킬때마다 각각 다른 저장공간을 생성하기 때문에 하나의 클래스로 여러개의 객체를 생성할수 있다.

위 PayCalc 클래스를 보면 우선 각각의 객체를 생성한뒤에
p1객체의 bonbong과 name을 넣은 다음 Method를 이용하여 세금을 계산하고
세금을 뺀 실수령액을 계산한뒤 출력까지 시켰다.
p2와 p3도 마찬가지로 변수만 넣고난뒤에 Method를 이용하여 매우 간단하게 출력시켰다.

이렇게 미리 클래스를 만들어서 객체로 사용하면 반복되는 작업을 단 한번의 작업으로 줄일수 있다.
그리고 만약 세금이 바뀌게 되면 setTex()메소드만 수정해주면 
모든 사원들의 세금이 수정되기 때문에 유지보수에 용이해 진다.

바로 객체지향의 재사용성과 유지보수의 용이함이 이렇게 나오게 되는것이다.



자 클래스와 객체에 대해서 알아보았는데 어떻게 보면 메소드와 비슷해보이기도 한다.
메소드처럼 호출할때에만 사용하며 호출할때마다 새로 생성된다.
실제로 C언어에서는 메소드를 중심으로 프로그램이 짜진다고 한다.
하지만 JAVA에서는 객체를 중심으로 프로그램을 짠다.

별반 차이가 없어보이지만 C언어와 JAVA에서 각각 1000줄짜리의 프로그램을 짜고난후
그것을 10000줄짜리 프로그램으로 확장시켜라고 하면 그때 차이가 나게 된다.

JAVA는 이미 만들어 놓은 클래스들을 유용하게 사용하여 확장하지만
C언어는 1000줄짜리와 10000줄짜리의 프로그램은 기본베이스부터 고쳐야 된다고 들었다.
(필자가 C언어를 몰라서 확실한게 아니니 100% 맞다고 생각하진 말자;;)

아무튼 그만큼 JAVA의 객체지향개념은 숙련되면 숙련될수록 빛을 발하는 것이니 
JAVA의 기본개념을 다 알고 난뒤 좀더 깊게 들어가보는것도 좋을것 같다.



자 이번 Chapter에서는 객체와 클래스의 관계와 객체의 사용법을 배워보았다.
자 이 다음부터는 점점 머리가 복잡해 진다. 아직까지는 쉬운것이다.;;;
필자도 조금 아리까리한 부분이 많기때문에(ㅠㅠ)
혹 보다가 이상한 부분이나 잘 이해가 가지 않는 부분이 있으면
필히 말을 해주었으면 한다!!! 








+ Recent posts