본문 바로가기

Java/기본 이론

[JAVA] Chapter 14. 클래스

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

 

자바는 객체 지향 프로그래밍으로 모든 데이터를 객체로 취급한다.

객체는 하나의 사물(Object)을 말하는데, 사물은 다양한 속성을 포함하고 있다.

사물은 모양(상태; State)와 기능(행동; Behavior)을 가지고 있으며, 인간은 사물을 표현할 때 이 두 가지의 정보를 중심으로 설명하고 인식한다.

 

예를 들어, 비행기라는 사물을 설명할 때 고철로 이루어진 새 모양의 운송수단으로 설명한다면, 고철이 무엇인지와 새 모양은 무엇인지, 운송수단은 무엇인지 설명할 필요가 있다.

여기서 주목할 점은 사물을 설명하는 것은 결국 그 사물이 가지고 있는 속성을 설명하는 것이고, 이 속성 자체도 '객체'라는 것이다. 

물론 사람이 이러한 객체의 정보를 세분화하면 최소 단위로 표현할 수 있을 것이고, 더이상 쪼개지지 않는 고유 속성을 도출할 것이다.

 

요약하자면 객체는 속성의 집합이며, 속성 또한 속성으로 이루어진 '객체'이다. 

실세계에서의 대부분의 대상은 속성을 가지고 있고, 이러한 속성을 표현하는 것이 바로 객체이다.

객체 지향 프로그래밍 언어는 이러한 객체를 중심으로 프로그램을 구축하는 언어이다. 

 

2. 클래스 (Class)

자바에서 클래스란 객체를 정의하는 '구조'를 말한다.

설계도, 틀 등 다양한 단어로 설명할 수 있지만, 결국 클래스는 객체가 가지고 있는 속성을 구조화하는 것이다.

앞서 서론에서 이야기 했으나 속성 또한 '객체'일 가능성이 높고, 객체를 모아서 '객체'를 표현하는 것이 가능하다. 

 

데이터는 실세계의 모든 정보를 지칭하기도 하지만, 프로그래밍에서 말하는 데이터는 사람에게 필요한 정보를 정제한 것이다.

정제한 데이터는 모든 정보를 담을 필요가 없기 때문에 필요한 규격과 규칙을 설정할 수 있고, 이러한 구조를 형성하는 설계도가 있다면, 이 설계도를 토대로 유사한 객체를 '다수' 생성할 수 있다. 

 

쉽게 말하자면, 붕어빵을 구울때 붕어빵의 틀이 있으면 붕어빵을 여러개 만들 수 있다.

여기서 붕어빵의 틀이 Class이고 붕어빵이 Object이다. 

 

자바에서 클래스는 객체의 상태를 나타내는 필드(field)와 객체의 행동을 나타내는 메소드(method)로 구성된다.

필드는 클래스 (class)에 포함된 변수(variable)를 의미하고 메소드는 필드에 선언된 변수가 수행하는 명령문의 집합이라고 할 수 있다. 

 

3. 인스턴스(instance)

자바에서 클래스를 사용하기 위해서는 우선 해당 클래스 타입의 객체를 선언해야 한다.

이렇게 클래스로부터 객체를 선언하는 과정이 클래스의 인스턴스화이다.

인스턴스는 클래스의 구조가 컴퓨터 저장공간에 할당된 실체를 의미한다.

쉽게 말해서 인스턴스는 클래스의 속성을 가진 객체가 메모리에 할당된 것을 말한다.  

 

자바에서는 하나의 클래스로부터 여러 개의 인스턴스를 생성할 수 있다.

이렇게 생성된 인스턴스는 독립된 메모리 공간에 저장된 자신만의 필드를 가질 수 있다.

하지만 해당 클래스의 모든 메소드(method)는 특정 클래스에서 생성된 모든 인스턴스가 공유한다. 

 

쉽게 말해, 자바라는 한 마을이 있는데, 인스턴스는 이 마을에서 자신만의 땅을 구입해서 집을 짓는 사람이다.

이 사람은 집을 멋있게 짓고 생활을 하려고한다.

이때 이 사람이 생활하기 위해 사용하는 기술이나 행동이 바로 메소드이다.

단편적으로 마을에서 같이 사용하는 풍차를 이용해 밀가루를 만드는 것이다.  

 

4. 메소드(method)

자바에서 클래스는 멤버(member)로 속성을 표현하는 필드(field)와 기능을 표현하는 메소드(method)를 가진다.

메소는 어떠한 작업을 수행하기 위한 명령문의 집합인데, 제어문이나 print 같은 예약어를 말한다. 

 

접근 제어자 반환타입 메소드이름(매개변수목록){ 선언부 및 구현부}

 

 메소드는 위와 같은 형태로 구성되어 있다. 

 

  • 접근 제어자: 해당 메소드에 접근할 수 있는 범위를 명시한다. public, priviate 등 접근 권한을 말한다.
  • 반환 타입(return type): 메소드가 모든 작업을 마치고 반환하는 데이터의 타입을 명시한다.
  • 메소드 이름: 메소드를 호출하기 위한 이름을 명시한다. 
  • 매개변수 목록(parameters): 메소드 호출 시에 전달되는 인수의 값을 저장할 변수들을 명시한다.
  • 구현부: 메소드의 고유 기능을 수행하는 명령문의 집합이다.

위의 모양으로 대표적인 메소드가 바로 public static void main(String[] args) {} 이다.

따지고 보면 print 또한 함수 명령어이다. 

 

자바에서는 하나의 클래스에 같은 이름의 메소드를 둘 이상 정의할 수 없다.

동일한 이름의 메소드를 선언하고 싶다면 메소드의 매개변수의 정보(개수나 타입)을 다르게 작성하면 된다.

이를 메소드 오버로딩(overloading)이라고 한다.