클래스(class)
클래스는 객체 지향 프로그래밍에서 객체를 생성하기 위한 일종의 설계도이다. 즉, 클래스는 객체의 속성과 동작을 정의하며, 이를 기반으로 객체를 생성할 수 있다.
클래스는 객체를 생성하는데 사용되며 객체는 클래스에 정의되고 설계된 내용 그대로 생성된다. 클래스를 정의함으로써, 객체를 생성하고 다양한 작업을 수행하는 데 필요한 속성과 동작을 미리 정의할 수 있다.
중요한 것은 클래스는 객체 그 자체가 아니라 객체를 생성하는 틀이라는 것이다. 휴대폰을 만들 때 휴대폰의 설계도이지 휴대폰 자체가 될 수 없는 것이다. 아래의 그림처럼 클래스를 통해 생성된 객체를 클래스의 인스턴스라고(instance)라고 부른다. 그럼 객체와 인스턴스의 차이가 무엇인지에 대해 또 궁금해진다.
✅ 객체와 인스턴스의 차이?
객체 지향 프로그래밍에서 매우 유사한 개념이지만 약간의 차이가 있다.
객체는 일반적으로 추상적인 개념이며 모든 인스턴스를 포괄하는 넓은 의미를 가지고 있는 반면, 인스턴스는 어떤 클래스로부터 생성된 것인지 구체적인 표현을 나타낸다.
예를들어, “Phone”클래스는 “휴대폰”에 대한 일반적인 정의를 나타내는 추상적인 개념이다. “아이폰”이라는 구체적인 자동차를 만들면, 이것은 “Phone”클래스의 인스턴스이면서 동시에 객체이다. 즉, “아이폰”은 “Phone”클래스에 따라 만들어진 구체적인 휴대폰 객체이다.
객체는 일반적인 정의를 나타내지만, 인스턴스는 클래스의 속성과 메서드를 상속받아 실체화된 것을 나타낸다.
✅ 왜 클래스를 정의하고이를 통해 객체를 생성하는가?
추상화를 통해 복잡한 문제를 단순화하고 중복된 코드 작성을 하지 않도록 하여 코드 재사용성을 높여 프로그래밍의 효율성을 높이기 위해서이다.
예를 들어, 블로그를 작성할 때 어제 A개념에 대해 작성한 글이 있다. 오늘 B개념을 작성하는데 A개념이 나왔다. 굳이 이전에 설명했던 A의 개념을 또 작성할 필요가 없다. A개념에 대해 작성한 링크를 삽입해서 효율성을 높이는 것과 같다.
클래스의 구성요소와 기본 문법
- 클래스 정의
class 클래스명 { // 클래스 정의
}
클래스는 기본적으로 class 키워드를 사용해 정의하며 클래스 이름을 정의하는 데는 몇 가지 권장사항이 있다.
- 클래스의 역할을 명확하게 나타낼 것
- 클래스명은 주로 대문자로 시작하는 것이 관례 → 카멜표기법(camelCase) : 여러 단어가 있을 때 앞 단어를 제외한 첫 글자를 대문자로 표기 → 파스칼표기법(PascalCase) : 모든 단어의 앞자리를 대문자로 표기
- 클래스명은 명사나 명사구로 구성
- 한 프로젝트 내에서 일관성을 유지할 것
- 클래스의 구성요소
클래스는 필드(field), 메서드(method), 생성자(constructor), 이너 클래스(inner class) 네 가지
1. 필드(Field) : 클래스 내부에 선언된 변수로, 속성을 나타낸다.
→ 클래스 내부의 메서드들에서 접근하여 사용할 수 있는 데이터를 의미한다.
예를 들어, 다음과 같은 클래스에서 brand와 model이 필드이다.
public class Phone {
String brand; // 필드
String model;
}
2. 메서드(Method) : 클래스 내부에 선언된 함수로, 클래스의 기능을 나타낸다.
→ 필드의 값을 조작하거나 다른 작업을 수행한다.
예를 들어, 다음과 같은 클래스에서 call과 sendMessage가 메서드이다.
public class Phone {
String brand; // 필드
String model; // 필드
public void call(String phoneNumber) { // 메서드
// 전화 걸기 로직
}
public void sendMessage(String phoneNumber, String message) {
// 문자 보내기 로직 // 메서드
}
}
3. 생성자(Constructor) : 객체를 생성할 때 호출되는 특수한 종류의 메서드로, 객체를 생성하는 역할을 한다.
→ 객체가 가지는 필드들을 초기화한다.
예를 들어, 다음과 같은 클래스에서 Phone은 생성자이다.
public class Phone {
String brand; // 필드
String model; // 필드
public Phone(String brand, String model) { // 생성자
this.brand = brand;
this.model = model;
}
public void call(String phoneNumber) {
// 전화 걸기 로직
}
public void sendMessage(String phoneNumber, String message) {
// 문자 보내기 로직
}
}
4. 이너 클래스(Inner Class) : 클래스 내부에 선언된 클래스로, 외부 클래스의 멤버들에 접근할 수 있습니다.
예를 들어, 다음과 같은 클래스에서 Camera는 Phone 클래스의 이너 클래스입니다.
public class Phone {
String brand; // 필드
String model; // 필드
public Phone(String brand, String model) { // 생성자
this.brand = brand;
this.model = model;
}
public void call(String phoneNumber) {
// 전화 걸기 로직
}
public void sendMessage(String phoneNumber, String message) {
// 문자 보내기 로직
}
public class Camera { // 이너 클래스
public void takePicture() {
// 사진 촬영 로직
}
public void recordVideo() {
// 동영상 촬영 로직
}
}
}
생성자를 제외한 나머지 요소를 클래스의 멤버(member)라고 하며 필드와 메서드는 각 클래스가 가지는 속성과 기능을 대표한다.
객체(Object)
객체는 속성과 기능이라는 두 가지 구성요소로 이루어져 있다.
속성과 기능은 각각 필드와 메서드로 정의되는데 하나의 객체는 다양한 속성과 기능의 집합으로 이루어져 있다.
- 속성이 변수
- 기능이 메서드
이제 이 Phone이라는 Class로 실제 객체를 생성할 수 있다.
객체의 생성
class PhoneTest {
public static void main(String[] args) {
Phone iphone = new Phone(); // Phone 클래스를 기반으로 생성된 iphone 인스턴스
Phone ZFlip = new Phone(); // Phone 클래스를 기반으로 생성된 ZFlip
}
객체의 생성은 위와 같이 new 키워드를 이용해 실제 객체를 생성할 수 있다. 그리고 생성 후 포인트 연산자(.)을 활용해 해당 객체에 접근이 가능하다.
객체와 인스턴스의 차이점이 무었인가에 대해 고민을 많이 했다. 차이가 없는데 있다고 하니 있는 그 차이점이 무엇인지 자꾸 궁금하기 때문이다. 인스턴스는 클래스를 통해 만들어진 인스턴스1, 인스턴스2와 같이 그 자체를 말하며 객체는 이러한 인스턴스들을 말한다. 즉 객체가 조금 더 넓은 의미인 것이다.
오늘도 스스로 이해할 수 있을 때 까지 학습했길 바라며: )
끝내본다아~
'LANGUAGE > JAVA' 카테고리의 다른 글
[JAVA] JAVA 객체지향 프로그래밍 / 메서드 오버로딩(Method Overloading)이란? (0) | 2023.04.23 |
---|---|
[JAVA] 필드(Field)와 메서드(Method) / 변수의 구분 (0) | 2023.04.22 |
[JAVA] 객체 지향 프로그래밍 기초 / 추상화란? OOP의 특성 알기 (0) | 2023.04.21 |
[JAVA] JAVA 배열(Array) 기본 개념 / 배열이란? 배열 생성 방법 (0) | 2023.04.21 |
[JAVA] JAVA 제어문 - 반복문(while) / do-while구문 (0) | 2023.04.19 |