객체 지향 프로그래밍 (Object Oriented Programming, OOP)
객체 지향 프로그래밍이란, 우리가 사는 실세계와 비슷하게 소프트웨어를 작성하는 방법론입니다.
객체란?
객체 또는 오브젝트(object)는 클래스에서 정의한 것을 토대로 메모리(실제 저장공간)에 할당된 것으로 프로그램에서 사용되는 데이터 또는 식별자에 의해 참조되는 공간을 의미하며, 변수, 자료 구조, 함수 또는 메소드가 될 수 있습니다. 프로그래밍 언어는 변수를 이용해 객체에 접근하므로 객체와 변수라는 용어는 종종 함께 사용됩니다. 그러나 메모리가 할당되기 전까지 객체는 존재하지 않습니다.
객체의 특징
- 핵심 개념: 객체 지향 기술의 가장 핵심 개념입니다.
- 상태와 동작: 객체는 상태와 동작을 가지고 있습니다. 객체의 상태를 속성, 객체의 동작을 기능이라고도 합니다.
글로만 이해하기 어려울 수 있으므로, 예시를 통해 설명하겠습니다.
예시
객체로 만들지 않은 학생 성적 관리 프로그램을 작성해보겠습니다.
public class StudentScoreManager {
public static void main(String[] args) {
String studentName = "홍길동";
int kor = 80;
int math = 90;
int eng = 85;
System.out.println(studentName + ": " + "국어 : " + kor + " 수학 : " + math + " 영어 : " + eng);
}
}
이렇게 간단하게 작성할 수 있습니다. 그러나 클래스 OOP를 사용해야 하는 이유는 무엇일까요?
현재는 1명의 학생만 입력했습니다. 2명을 관리해볼까요?
public class StudentScoreManager {
public static void main(String[] args) {
String studentName1 = "홍길동";
int kor1 = 80;
int math1 = 90;
int eng1 = 85;
String studentName2 = "김철수";
int kor2 = 97;
int math2 = 69;
int eng2 = 89;
}
}
슬슬 뭔가 잘못되어 가고 있다는 게 느껴지실 겁니다.
그럼 학생이 30명일 때는? 과목이 3개가 아니라 5개, 10개일 때는?
코드가 늘어가면서 관리하기 매우 힘들어집니다. 이를 객체로 만들어 보겠습니다.
public class StudentScoreManager {
String name;
int kor;
int math;
int eng;
// 기본 생성자
public StudentScoreManager() {
this.name = null;
this.kor = -1;
this.math = -1;
this.eng = -1;
}
// 매개변수가 있는 생성자
public StudentScoreManager(String name, int kor, int math, int eng) {
this.name = name;
this.kor = kor;
this.math = math;
this.eng = eng;
}
public static void main(String[] args) {
// 객체 생성
StudentScoreManager student1 = new StudentScoreManager("홍길동", 80, 90, 85);
StudentScoreManager student2 = new StudentScoreManager("김철수", 97, 69, 89);
// 객체 정보 출력
System.out.println(student1.name + ": " + "국어: " + student1.kor + " 수학: " + student1.math + " 영어: " + student1.eng);
System.out.println(student2.name + ": " + "국어: " + student2.kor + " 수학: " + student2.math + " 영어: " + student2.eng);
}
}
다른 코드는 보지 말고, main 메서드만 봐주셨으면 좋겠습니다.
1명당 4개의 코드가 필요했던 코드가 1개의 코드로 바뀌었습니다.
public static void main(String[] args) {
StudentScoreManager student1 = new StudentScoreManager("홍길동", 80, 90, 85);
StudentScoreManager student2 = new StudentScoreManager("김철수", 97, 69, 89);
}
객체 예시: 책
책을 객체로 표현해보겠습니다.
- 저자
- 제목
- 발행 날짜
책에는 모두 저자와 제목, 발행 날짜가 있습니다. 하지만 책마다 모두 다른 값을 가지고 있습니다. 즉, 클래스(class)로 객체를 만든다는 것은 같은 속성을 가지는 것을 하나로 묶어 정의한다는 뜻입니다. (속성의 값이 다르기 때문에)
// 책을 나타내는 클래스 정의
class Book {
String author;
String title;
String publishDate;
// 기본 생성자
public Book() {
this.author = "";
this.title = "";
this.publishDate = "";
}
// 매개변수가 있는 생성자
public Book(String author, String title, String publishDate) {
this.author = author;
this.title = title;
this.publishDate = publishDate;
}
}
public class BookExample {
public static void main(String[] args) {
// 책 객체 생성
Book book1 = new Book("천인국", "Power JAVA 3탄", "2022-09-13");
Book book2 = new Book("신선영", "스프링 부트3 백엔드 개발자 되기 자바 편 2탄", "2024-04-05");
// 객체 정보 출력
System.out.println("책 1 - 저자: " + book1.author + ", 제목: " + book1.title + ", 발행 날짜: " + book1.publishDate);
System.out.println("책 2 - 저자: " + book2.author + ", 제목: " + book2.title + ", 발행 날짜: " + book2.publishDate);
}
}
Java에서 객체를 왜 사용하는지 이해하셨을 것이라고 생각합니다.
객체의 특징으로는 상태와 동작을 가지고 있다고 했지만 위 예시들은 전부 상태만을 나타내고 있습니다.
클래스 내에 선언된 변수를 객체의 상태라고 하며 이를 필드(field)라고 부릅니다.
객체의 동작은 클래스에 있는 함수를 말하고 있습니다. 이를 메소드(메서드)라고 부릅니다.
이를 전부 표현하는 클래스의 예시로는 텔레비전이 있습니다.
필드로는
- 채널 번호
- 볼륨
- 전원 상태
메소드로는
- 켜기
- 끄기
- 채널 변경
- 볼륨 변경
public class Television {
// 채널 번호
int channel;
// 볼륨
int volume;
// 전원 상태
boolean isTurnedOn;
// 전원 키기
public void turnOn() {
this.isTurnedOn = true;
}
// 전원 끄기
public void turnOff() {
this.isTurnedOn = false;
}
// 채널 바꾸기
public void setChannel(int n) {
this.channel = n;
}
// 볼륨 바꾸기
public void setVolume(int n) {
this.volume = n;
}
// 현재 TV 상태를 문자열로 반환
@Override
public String toString() {
return "TV의 채널은: " + this.channel + ", 볼륨은: " + this.volume + ", 상태는: " + (this.isTurnedOn ? "켜짐" : "꺼짐");
}
// TV의 초기 상태를 설정하는 생성자
public Television(int channel, int volume, boolean isTurnedOn) {
this.channel = channel;
this.volume = volume;
this.isTurnedOn = isTurnedOn;
}
public static void main(String[] args) {
// 초기 상태를 설정하여 TV 객체 생성
Television tv = new Television(5, 12, true);
// 초기 상태 출력
System.out.println(tv);
// TV 끄기, 채널 변경, 볼륨 변경
tv.turnOff();
tv.setChannel(10);
tv.setVolume(40);
// 변경된 상태 출력
System.out.println(tv);
}
}
이렇게 객체를 활용하여 코드를 작성하면 코드의 중복을 줄일 수 있습니다. 앞선 학생 성적 관리 프로그램 예제에서 코드의 중복이 매우 많은 것을 확인할 수 있었습니다. 객체를 이용하면 코드의 중복을 줄일 수 있고, 하나를 수정하더라도 관련된 메서드만 수정하면 되기 때문에 코드 재사용성과 유지보수성이 매우 좋아집니다.
따라서 우리는 이러한 객체를 활용해 객체 지향 프로그래밍(OOP)을 해야 합니다.
정리
- 객체 지향 프로그래밍(OOP):
- 우리가 사는 실세계와 비슷하게 소프트웨어를 작성하는 방법론입니다.
- 프로그램을 객체 단위로 나누어, 객체 간의 상호작용을 통해 문제를 해결합니다.
- 객체와 클래스:
- 객체: 클래스에서 정의한 것을 토대로 메모리에 할당된 데이터 또는 식별자에 의해 참조되는 공간.
- 클래스: 객체를 정의하는 설계도. 객체의 상태(필드)와 동작(메서드)을 포함합니다.
- 객체의 특징:
- 상태(필드): 객체가 가지고 있는 데이터.
- 동작(메서드): 객체가 수행하는 기능.
- OOP의 장점:
- 코드 재사용성: 클래스를 통해 코드의 중복을 줄이고 재사용성을 높입니다.
- 코드 유지보수: 객체 단위로 코드를 나누어 관리하기 쉽고, 변경이 용이합니다.
- 현실 세계 모델링: 현실 세계의 개념을 프로그래밍에 반영하여 직관적입니다.
- 예제 코드:
- 학생 성적 관리 프로그램 예제를 통해 객체 지향 프로그래밍의 필요성을 설명.
- 책과 텔레비전을 객체로 만들어 필드와 메서드를 통해 상태와 동작을 정의.
'Java' 카테고리의 다른 글
[Java] String 메소드 정리 (0) | 2024.08.13 |
---|---|
[Java] 예외 Exception와 예외 처리 (0) | 2024.07.30 |
[Java] 배열 (0) | 2024.07.09 |
[Java] 반복문 while 문 (0) | 2024.07.05 |
[Java] 반복문 for문 (0) | 2024.07.04 |