0. 개요
우리가 프로그래밍을 하다보면 변수에 여러 값을 담아야하는 경우가 많다.
다만 변수에는 값을 하나만 담을 수 밖에 없으며, 변수와 값의 자료형이 다르면 값을 담을 수 없다.
그래서 고안된 것이 '객체 (Object)'이다.
객체에는 정수, 실수, 논리형 등의 각기 다른 값들을 담는 것이 가능하다.
이러한 객체를 만들기 위해서 필요한 것이 '클래스 (Class)'이다.
https://rclogstorage.tistory.com/14
예전에 '객체 지향 프로그래밍'이라는 개념에 대해 다룰 때 클래스와 객체에 대해 설명을 한 적이 있었다.
다만 이 두 개념이 중점이 아니었기 때문에 간략하게 설명하고, 상세한 부분은 추후에 정리해서 업로드하기로 했었다.
따라서 이번에는 클래스와 객체에 대한 것을 정리했고, 이를 설명해보겠다.
1. 클래스 기본 개념
① 클래스(class)의 정의
- 객체를 만들기 위한, 일종의 설계도와 같은 개념
- 사용자가 직접 정의해서 사용 가능한 데이터 타입
- '객체(object)'는 "클래스라는 데이터 타입으로 만들어진 변수"라고 보면 될 것이다.
클래스는 객체가 생성될 때 실체를 가지고, 객체를 통해서 클래스에 포함된 다양한 데이터를 활용할 수 있다.
- 클래스는 생성될 객체의 정보나 상태를 '필드(field)'에, 객체의 동작이나 기능을 '메소드(method)'에 저장된다.
//클래스 선언, 객체 생성
public class Main {
public static void main(String[] args){
Custom custom01 = new Custom();
//'new' -> new 연산자 뒤에 나오는 생성자를 이용해서 메모리에 객체를 만들라는 의미
// 이때 만들어지는 객체를 'instance'라고 한다.
// Custom 클래스를 참조하는 변수 'custom01' 선언, Custom 객체 1개가 생성된다.
}
}
class Custom {
//'Custom.java' 파일을 생성한다.
// 해당 파일을 저장하면 디스크에 'Custom'이라는 클래스를 생성한다.
// 'Custom' 클래스를 만들었다고 해도, 'Custom' 객체를 생성한 것은 아님
// 클래스 == 객체의 설계도
}
② 객체(object)와 인스턴스(instance)의 정의
필드와 메소드에 대해 설명을 하기 전에, 객체와 인스턴스의 정의를 알고 갈 필요가 있다는 것을 알았고
자바 관련 서적들과 인터넷에 있는 자료들을 참고하고, 그 내용들을 정리해봤다.일단 객체라는 단어의 의미를 말하자면 다음과 같다.
"현실에 존재하거나 생각할 수 있는 것"
즉, 책상이나 의자와 같은 사물도 객체이고, 공부나 운동과 같은 개념으로 존재하는 것도 모두 객체이며더 나아가서 사람이 생각하고 표현할 수 있는 모든 것들도 객체로 볼 수 있다.결론을 내자면 객체라는 것은 추상적이고 철학적인 개념에 가까운 것이기 때문에개발 관점에서도 명확하게 무엇이다. 라고 결론을 내기는 어려운 것 같다.
그럼에도 나름대로 다음과 같이 정의를 내보았다.
(1). 객체(object)의 정의
- 소프트웨어 상에서 구현해야 할 대상, 개발 대상
- 객체를 만들기 위한 설계도가 '클래스(class)'이다.
- 클래스에서 선언한대로 그대로 만들어진 실체
(2). 인스턴스(instance)의 정의
- 클래스를 바탕으로 소프트웨어 상에서 구현된 구체적인 실체로
객체를 소프트웨어에 실체화하면 그것을 '인스턴스(instance)'라고 한다.
- 추상적인 개념과 구체적인 객체 사이의 관계에 초점을 맞출 때 사용하며
"~의 인스턴스"와 같은 형식으로 사용된다.
- 인스턴스는 객체에 포함된 개념으로, 객체는 '클래스의 인스턴스'라 할 수 있다.
- 하나의 클래스로 부터 여러 개의 인스턴스를 만들 수 있으며
생성된 인스턴스는 독립된 메모리 공간에 자신만의 '필드(field)'를 가지고
해당 클래스의 '메소드(method)'는, 해당 클래스로 부터 생성된 모든 인스턴스가 공유한다.
인스턴스를 정의내리자면 이런 식으로 정의할 수 있다.
다만 인스턴스라는 용어 자체는 클래스와 객체 사이의 관계로만 한정지을 필요가 없는 것이
시스템 관점에서는 실행 프로세스가 프로그램의 인스턴스로 볼 수 있기 때문에
인스턴스는 "어떠한 원본으로 부터 생성된 복제본"이라고 해도 될 것이다.
③ 필드(field)의 정의
- 클래스의 구성 요소 중 하나, 클래스에 포함된 변수를 의미한다.
- 게임 캐릭터로 치면, 해당 캐릭터의 이름, 체력과 같은 정보나 상태와 같은 것들을 속성이라고 하며
자바에서는 이를 '필드(field)'라고 한다.
④ 메소드(method)의 정의
- 클래스의 구성 요소 중 하나로, 필드가 물체의 상태라면 메소드는 물체의 행동에 해당한다.
- 어떠한 특정 작업을 수행하기 위한 명령문의 집합
- 입력 값이 존재하고, 그 값을 받아서 특정한 동작을 수행하고 결과를 도출하는 수학의 함수와 비슷한 개념
여기서 입력 값을 '매개 변수'라고 하며, 결과 값을 '반환 값'이라고 한다.
//필드, 메소드 상세 설명
public class Main {
public static void main(String[] args) {
MyCustom A = new MyCustom();
//new 연산자에 의해 MyCustom 객체가 하나 만들어진다.
//MyCustom 객체를 참조하는 참조 변수 'A'도 같이 만들어짐.
//여기서 변수 A는 객체가 아니라 객체를 컨트롤 할 수 있는 리모콘이라고
//보면 된다.
//필드는 클래스에 포함된 변수로, 단독으로는 실행할 수 없다.
//컴퓨터로 치면 'MyCustom'이라는 폴더에 저장된 텍스트 파일이라고 보면 된다.
//텍스트 파일은 읽기와 수정이 가능하지만, 실행은 할 수 없다.
//반대로 메소드는 실행 파일, 'exe'파일이라고 보면 된다.
//읽기와 쓰기는 못하지만 실행은 할 수 있다.
//MyCustom 객체의 속성, 필드를 수정한다.
A.name = "Vincent";
A.age = 25;
A.isMarried = false;
A.talk(); //MyCustom 객체 내부의 'talk()' 메소드 실행
}
}
class MyCustom {
//필드 (field)
String name;
int age;
boolean isMarried;
//메소드 (method)
void talk(){
System.out.println("=== 자기 소개 시작 ===");
System.out.printf("이름 : %s\n", name);
System.out.printf("나이 : %d\n", age);
System.out.printf("결혼 여부: %b\n", isMarried);
System.out.println("안녕하세요.");
System.out.println("=== 자기 소개 종료 ===");
}
/* 메소드 구조
* '접근 제어자''반환 타입''메소드 이름'(매개변수 목록) {구현부}
* (1). 접근 제어자
* - 해당 메소드에 접근할 수 있는 범위를 명시
* (2). 반환 타입(Return Type)
* - 메소드가 모든 작업을 마치고, 반환하는 데이터 타입을 명시
* (3). 메소드 이름
* - 외부에서 해당 메소드를 호출하기 위한 이름
* (4). 매개변수 목록(Parameters)
* - 메소드를 호출 시, 전달되는 인수의 값을 저장할 변수를 명시
* (5). 구현부
* - 메소드의 고유 기능을 수행하는 명령문의 집합
*/
}
2. 마치며
클래스와 객체에 대한 내용들을 정리하는 과정에서
개념적인 부분들을 제대로 짚고 넘어가야 한다고 생각해서
정보를 더 수집하고 이를 정리하다보니 처음에 계획했던 것보다 더 오래걸리고 분량도 늘어났다.
개인적으론 자바를 공부하면서 클래스와 객체에 대한 개념을 내가 만족하는 수준까지는 바로 잡고 넘어갈 필요가 있다고
스스로 판단을 내리고, 내용을 계속 수정하다 보니 시간 소요가 상당했던 것 같다.지금까지 설명한 내용들을 다시 정리하기 위해 예제로 활용하기 위한 소스 코드를 작성했지만이거는 Part2에서 다뤄보도록 하겠다.
'Programming > Java' 카테고리의 다른 글
[Java] 함수, 메소드 (0) | 2022.11.30 |
---|---|
[Java] 7. 클래스와 객체 (Part 2) (0) | 2022.11.21 |
[Java] 6. 배열 (Part 2) (0) | 2022.10.19 |
[Java] 6. 배열 (Part 1) (0) | 2022.10.19 |
[Java] 5. 반복문 (0) | 2022.10.11 |