객체와 객체 지향 프로그래밍(OOP : Object-Oriented Programming)
객체 지향 프로그래밍이란, 말 글대로 객체를 지향하는 프로그래밍 방법을 말한다. 객체는 우리 실생활에 존재하는 모든 것으로 생각할 수 있다. 예를 들면, 눈에 보이는 컴퓨터, 책, 사물, 인물 등이 될 수 있다. 객체는 일반적으로 상태를 표현할 수 있고 우리가 행동으로 실행할 수 있는 모든 것을 말한다. 우리는 이런 객체를 중심으로 프로그램 구조를 설계하고 프로그래밍 하는 것을 객체 지향 프로그래밍이라고 한다.
클래스
클래스는 객체를 생성하기 위한 제작 설명서이다. 어떤 물건을 만들기 위한 매뉴얼이라고 생각할 수 있다. 이 클래스를 기반으로 객체를 생성한다. 자바에서는 하나의 클래스로 여러 개의 객체를 생성하고 사용할 수 있다.
클래스 선언은 아래와 같다
public class Car {
}
클래스의 용도 두 가지
- 실행용 : 프로그램 전체에서 단 하나의 클래스로, 프로그램의 실행을 전적으로 맡고 있다. 프로그램의 시작 메서드인 main()을 가지고 있는 클래스를 말하며, 다른 클래스에서 사용하지 않는다.
- 라이브러리용 : 다른 클래스에서 이용할 목적으로 선언되는 클래스
하나의 클래스가 두 가지 용도의 역할을 모두 수행할 수도 있다. 하지만 유지 보수와 객체 지향 프로그래밍의 특징인 모듈화를 고려해 별도로 분리하여 작성하는 것이 좋다. 따라서 일반적으로 하나의 프로그램에서 실행용 클래스 1개를 제외한 나머지 클래스는 모두 라이브러리용 클래스이다. 클래스를 선언하는 방법은 어렵지 않다. 메서드를 선언하는 것보다 간단하게 느껴질 수 있는데 선언 방법은 다음과 같다.
접근 제한자 class 클래스 이름 {
}
접근 제한자 : 변수와 마찬가지로 클래스의 접근 범위를 제한
class : class를 선언함을 뜻한다.
클래스 이름 : 변수처럼 이름을 가지고, 객체를 생성할 때 사용한다.
클래스명은 마치 변수의 자료형처럼 '클래스명'의 데이터를 담을 수 있는 '객체명'이라는 이름을 가진 변수를 선언하는 것과 형태가 비슷하다. Cat c; 이런식으로 선언하면 된다. 이 객체 변수에 객체를 생성해 대입하면 객체명 = new 클래스명(); 하면 된다.
객체를 생성하는 키워드는 'new'인데, 클래스를 이용해 객체를 생성할 수 있도록 도와준다.
클래스 구성
클래스를 바탕으로 생성된 객체가 가져야 할 특징과 요소들로 구성되는데 3가지 요소는 다음과 같다.
- 필드(field)
- 메서드(method)
- 생성자(constructor)
필드는 객체가 가져야 할 데이터 상태를 저장하는 변수를 의미한다. 변수라고 하지만 필드라고 부른다. 클래스 내에 정의되고 객체가 생성될 떄 그 객체와 함께 존재하는 데이터이다.
필드는 변수와 마찬가지로 값을 읽거나 변경할 수 있다. 클래스 안에 선언된 변수이기 때문에, 클래스 안에서는 기존에 변수를 사용했던 것처럼 사용할 수 있다. 다른 클래스에서도 사용할 수 있는데, 필드에 접근하기 위해서는 객체명.필드명 이런식으로 사용하면 된다.
메서드란 객체의 기능을 담당하는 중괄호{} 블록을 말한다. 특정 기능을 수행하는 코드를 따로 빼서 중괄호 안에 작성하며, 1개의 메서드는 일반적으로 1개의 기능을 수행한다.
반환 타입 메서드명() {
// 기능을 수행할 코드 작성
}
이와 같이 선언하는데, 메서드를 호출하면 블록 안에 있는 코드들이 위에서부터 순차적으로 모두 실행되고 경우에 따라 실행한 결과를 호출한 곳으로 다시 돌려주기도 한다. 우리는 이를 '반환한다'라고 표현하고, 반환하는 결과값을 '리턴값'이라고 부르기도 한다.
구현한 메서드를 사용하는 방법은 필드의 사용법과 동일하다. 메서드를 선언한 클래스 안에서 메서드를 사용할 때는 단순히 메서드명만 호출하면 되지만, 다른 클래스에서 메서드를 사용하려면 객체를 먼저 생성한 후 참조 변수를 이용해 그 객체의 메서드를 사용해야 한다. 객체가 존재해야 메서드도 존재하기 때문이다.
클래스명 객체명 = 클래스명(); // 객체 생성
객체명.메서드명(); // 생성한 객체의 메서드 호출(사용)
메서드 중에서 객체를 생성할 때 반드시 호출해야 하는 메서드가 있다. 이 메서드는 객체를 생성하면서 객체 변수를 초기화하는 역할을 하는데, 이를 생성자라고 한다.
클래스명 객체명 = new 클래스명();
생성자라는 메서드는 클래스명과 이름이 같다. 근데 이런 메서드를 생성한 적이 없음에도 생성자를 호출하여 객체를 생성해왔다. 그 이유는 직접 선언하지 않아도 기본 생성자가 자동으로 생성되고 우리 눈에만 보이지 않기 때문이다.
인스턴스 멤버와 정적 멤버
클래스 안에 선언된 필드와 메서드를 클래스 멤버라고 부른다. 클래스에 포함된 요소라는 의미로 '멤버'라는 용어를 사용하고 있다. 그럼, 클래스를 이용해서 객체를 생성할 떄 모든 클래스 멤버가 각 객체의 멤버로 생성되는 걸까
모든 객체가 동일한 값을 가져야 한다는 가정을 했을 때, 가족 구성원을 생각해 보겠다. 구성원의 이름과 나이는 모든 객체가 다르겠지만 한집에 함께 살기 때문에 구성원의 주소는 모든 객체가 동일할 것이다. 하나의 객체의 주소만 변경해도 다른 객체의 주소는 바뀌지 않는다. 이렇게 모든 객체의 필드 값이 똑같아야 한다면, 인스턴스 멤버나 정적 멤버를 활용하면 된다.
정적멤버란, 필드와 메서드를 선언할 때 static이라는 키워드가 붙은 멤버들을 말한다. static의 사전적 의미는 '고정된' 이라는 뜻을 갖고 있다. 프로그래밍 언어에서 static은 클래스에 고정되었다 라는 의미로 쓴다.
클래스명.필드;
클래스명.메서드();
이와 같이 클래스 이름을 통해 호출한다.
정적 멤버의 경우, 객체마다 가지는 데이터 기능이 아니기 때문에 모든 객체가 같은 값을 가져야 할 경우에 사용하는 것이 효율적이다. 따라서 각 클래스의 멤버를 선언할 때는 충분히 고려한 후 정적 멤버로 선언할지에 대한 결정을 내리는 것이 좋다. 예를 들어 학생 클래스에 이름을 추가해야 한다고 할 때 학생의 이름은 각 객체가 가져야 할 데이터이기 때문에 정적 필드가 아닌 인스턴스 필드로 선언해야 한다.
'BOOK' 카테고리의 다른 글
| [JAVA] MENTOR JAVA SECTION 9 (1) | 2025.01.16 |
|---|---|
| [JAVA] MENTOR JAVA SECTION 8 (2) | 2025.01.15 |
| [JAVA] MENTOR JAVA SECTION 6 (1) | 2025.01.07 |
| [JAVA] MENTOR JAVA SECTION 5 (0) | 2025.01.06 |
| [JAVA] MENTOR JAVA SECTION 4 (0) | 2025.01.05 |