내가 살아가는 방식...

karma01.egloos.com

포토로그



자바강좌 - 객체지향 ( 클래스와 객체 ) JAVA

객체지향언어는 기존의 절차지향 언어와 비교해서 가장 큰 차이점은 Object Oriented Language라는 점입니다.

즉 객체를 중심에 두고 모든 프로그램의 단위를 객체로 모듈화해서 사용한다는 장점이 있다.

[객체 지향 프로그래밍(영어Object-Oriented Programming, OOP)은 컴퓨터 프로그래밍의 패러다임 중 하나이다. 객체 지향 프로그래밍은 컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러 개의 독립된 단위, 즉 "객체"들의 모임으로 파악하고자 하는 것이다. 각각의 객체는 메시지를 주고받고, 데이터를 처리할 수 있다.

객체 지향 프로그래밍은 프로그램을 유연하고 변경이 용이하게 만들기 때문에 대규모 소프트웨어 개발에 많이 사용된다. 또한 프로그래밍을 더 배우기 쉽게 하고 소프트웨어 개발과 보수를 간편하게 하며, 보다 직관적인 코드 분석을 가능하게 하는 장점을 갖고 있다. 그러나 지나친 프로그램의 객체화 경향은 실제 세계의 모습을 그대로 반영하지 못한다는 비판을 받기도 한다.] ( 위키백과 발췌.)


객체지향언어의 주요한 특징에 대해서 알아보겠습니다.


1. 코드의 재사용성 - 기존의 코드를 이용하여 새로운 코드를 쉽게 작성 가능

2. 코드의 관리 용이 - 적은 노력으로 쉽게 코드를 수정 및 변경 가능

3. 신뢰성이 높은 프로그래밍 가능 - 제어자와 메서드를 이용하여 데이터를 보호, 코드 중복을 제거, 코드 불일치로 인한 오동작 방지.


솔직히 객체지향언어의 이론을 안다고하여 실제 코드에 적용하기란 그렇게 쉽지 않습니다.


실제 프로젝트에서 기능에 기반한 코드를 만들고 ( 기존 절차지향 프로그램과 같은 방식으로...) 그 상태에서 객체지향으로 객체화 시키는 것도 한 방법이라고 생각합니다.


그럼 클래스와 객체에 대해서 알아보겠습니다.


클래스란 '객체를 정의해 놓은 것' 또는 ' 객체의 설계도' 또는 틀이라고 말할 수 있습니다.


클래스는 객체를 생성하는데 사용되며, 객체는 클래스에 정의된 대로 생성됩니다.


객체의 사전적 의미는 '실재로 존재하는 것' 입니다. 우리가 주변에서 볼 수 있는 책상, 의자, 자동차와 같은 사물들을 곧 객체라고 할 수 있습니다. 


객체지향이론에서는 사물과 같은 유형적인 것뿐만 아니라, 개념이나 논리와 같은 무형적인 것들도 객체로 간주합니다.


프로그래밍에서의 객체는 클래스에 정의된 내용대로 메모리에 생성된 것을 뜻합니다.


클래스와 객체의 관계를 우리가 살고 있는 실생활에서 예를 들면, 제품 설계도와 제품과의 관계라고 할 수 있겠습니다.


클래스와 객체를 예로 들면서 가장 많이 예로 드는게 있는데 그것은 붕어빵 기계와 붕어빵입니다.

붕어빵기계가 클래스가 되고 붕어빵이 객체라고 볼 수 있습니다.


또다른 예로는 스마트폰 설계도( 클래스), 스마트폰( 객체) 라고 할 수도 있겠네요.


자바에서는 JDK(Java Development Kit)에 개발에 필요한 많은 수의 클래스( JAVA API)를 기본적으로 제공하고 있습니다.


우리는 이런 자바 API를 이용해서 프로그래밍을 할때 적절히 이용하므로써 많은 도움을 받을 수 있습니다.


여기서 중요한 개념이 하나 나옵니다.


클래스로 부터 객체를 만드는 것을 클래스의 인스턴스화라고 합니다. 특정 클래스로 부터 만들어진 객체를 그 특정 클래스의 인스턴스(instance)라고 합니다.


인스턴스와 객체는 엄격이 말하면 용도에 따라서 약간(?)다르지만 거의 같다고 생각시면 될듯합니다.


이게 무슨말이냐고 하면 인스턴스는 객체와 같은 의미이지만, 객체는 모든 인스턴스를 대표하는 포괄적인 의미를 갖고 있으며, 인스턴스는 어떤 특정 클래스로 부터 만들어진 것인지를 강조하는 좀 더 구체적인 의미를 가지고 있다고 보시면 될듯합니다.


객체(인스턴스)의 구성요소에는 property와 function이 있습니다.


프로퍼티에는 멤버변수를 생각하시면 되고 펑션에는 메서드를 생각하시면 됩니다.


그러면 예를 들어서 붕어빵 클래스를 만들어 본다고 가정하겠습니다.


붕어빵 클래스의 property로 색상, 맛, 크기 라고 정하고 method로는 보라색 붕어빵을 만든다, 설탕을 첨가해 달콤한 맛을 만든다, 중간크기의 붕어빵을 만든다.라고 가정해보겠습니다.


class Fish {

String color;

String taste;

int size;

void paintedColorFish()

{

this.color = "보라색 붕어빵";

}

void tasteFish()

{

this.taste = "달콤한 맛이 나는 붕어빵";

}

void bigSizeFish()

{

++size;

}

void smallSizeFish()

{

--size;

}

}


대충 위와 같이 정의해 볼 수 있겠습니다.

붕어빵 클래스를 완성했으니, 이제는 붕어빵 클래스의 인스턴스를 만들어서 사용해보도록 하겠습니다.


클래스명 변수명

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


Fish fsh;

fsh = new Fish();


혹은


Fish fsh = new Fish();


아래와 같이 코딩하고 실행해 보겠습니다.

위의 코드를 설명하자면 30번째 라인에서 Fish클래스 타입의 참조변수 fsh를 선언합니다. 그렇게 되면 메모리에 참조변수 fsh에 대한 공간이 마련됩니다.


31번째 라인에서 연산자 new에 의해 Fish클래스의 인스턴스가 메모리의 빈 공간에 생성됩니다.

32번째 라인에서 Fish클래스의 멤버변수 size의 값을 참조변수 fsh로 접근하여 10으로 설정해줍니다.

33번째 라인에서 bigSizeFish() 메소드를 호출하고 34번째 라인에서 사이즈를 출력해줍니다.


그러면 아래 소스를 보겠습니다.


30, 31번째 라인에서 Fish클래스의 참조변수 fsh1으로 인스턴스를 만듭니다.

32번째 라인에서 Fish클래스의 참조변수 fsh2로 인스턴스를 만듭니다.

36번째 라인에서 fsh1의 사이즈를 10으로 설정합니다. 

출력결과를 보시면 아시겠지만, 같은 클래스로부터 인스턴스가 생성되었을지라도 각 인스턴스의 프로퍼티(멤버변수)은 서로 다른 값이 유지된다는것을 확인 할 수 있습니다.


계속해서 아래 소스를 보시겠습니다.


36번째 라인에서 fsh2를 fsh1에 대입합니다.

이는 fsh2 참조변수가 저장하고 있는 값(주소)를 fsh1 참조변수에 저장하는 것입니다.



덧글

댓글 입력 영역