1. 클래스란?
클래스는 객체 지향 프로그래밍(OOP)의 기본 구성 요소로 관련된 데이터와 메서드를 하나의 단위로 묶어주는 템플릿이다.
클래스를 사용하는 이유
- 코드의 재사용성 향상
- 유지보수의 용이성
- 코드의 구조화와 직관성 향상
- 데이터의 캡슐화 가능
2. 클래스의 기본 구조
- 필드(Fields): 클래스의 “상태”를 나타내는 변수들
- 생성자(Constructor): 객체 생성 시 “초기화”를 담당
- 메서드(Methods): 클래스의 “행위”를 정의하는 함수들
public class Dog {
// fields
String name;
int age;
// constructor
public Dog(String name) {
this.name = name;
}
// methods
public void bark() {
System.out.println(name + " says woof!");
}
}
- 사용 예시
// 객체 생성
Dog myDog = new Dog("Rex");
// 객체의 메서드 호출
myDog.bark();
// 객체의 필드 접근
System.out.println(myDog.name);
3. 생성자 (Constructor)
생성자는 객체가 생성될 때 자동으로 호출되는 특별한 메서드이다.
생성자의 특징
- 클래스명과 동일한 이름을 가짐
- 반환 타입이 없음
- 여러 개의 생성자를 정의할 수 있음(생성자 오버로딩)
- 매개 변수(넘겨줄 값)가 없는 경우 생략가능
public class Dog {
String name;
int age;
// 기본 생성자
public Dog() {}
// 매개변수가 있는 생성자
public Dog(String name) {
this.name = name;
}
// 모든 필드를 초기화하는 생성자
public Dog(String name, int age) {
this.name = name;
this.age = age;
}
}
4. 메서드 (Methods)
메서드는 특정 작업을 수행하는 코드의 집합이다. 접근 제어자의 경우 public으로 누구든지 쓸 수 있다.
public class Calculator {
// 1. 기본적인 메서드
public int add(int a, int b) {
return a + b;
}
// 2. 반환값이 없는 메서드
public void printMessage(String message) {
System.out.println(message);
}
// 3. 매개변수가 없는 메서드
public String getVersion() {
return "Calculator v1.0";
}
}
5. this()
this
는 현재 객체를 가리키는 참조 변수이다.
this의 사용
- 필드와 매개변수의 이름이 같을 때 구분을 위해 사용한다.
public class Dog {
String name;
int age;
public Dog(String name) {
this.name = name; // this로 필드와 매개변수 구분
}
}
- 생성자에서 다른 생성자를 호출할 때 사용한다.
public class Dog {
String name;
int age;
public Dog() {
this("멍멍이", 1); // 다른 생성자 호출
}
public Dog(String name, int age) {
this.name = name;
this.age = age;
}
}
6. super()
super
는 부모 클래스를 가리키는 참조 변수이다.
super의 사용
- 자식 클래스에서 부모 클래스의 멤버에 접근할 때 사용한다.
public class Animal {
String name;
public Animal(String name) {
this.name = name;
}
public void makeSound() {
System.out.println("동물 소리");
}
}
public class Dog extends Animal {
String breed;
public Dog(String name, String breed) {
super(name); // 부모 클래스의 생성자 호출
this.breed = breed;
}
@Override
public void makeSound() {
super.makeSound(); // 부모 클래스의 메서드 호출
System.out.println("멍멍!");
}
}
7. this()와 super() 제약 사항
자바는 객체의 안전한 생성을 위해 부모->자식 순서로 초기화하며 이 순서를 보장하기 위해 생성자의 첫 줄에서만 super()
나 this()
를 호출할 수 있도록 제한하고 있다.
첫 줄 규칙
public Dog() {
// 첫 줄에서만 호출 가능!
super(); // 부모 생성자 호출
// 여기서부터는 this()나 super() 사용 불가
}
왜 첫 줄에서만 가능할까?
- 초기화 순서
- 객체 생성할 때 반드시 부모부터 초기화해야 함
- 자식 객체 초기화 전에 부모가 준비되어야 함
- 이중 초기화 방지
public Dog() {
this(10); // 이미 여기서 super()가 암시적으로 호출됨
super(); // ❌ 부모를 두 번 초기화하게 됨
}
변수명 중복 시
변수명이 중복되지 않는 경우 this
나 super
생략 가능하다. 하지만 명확성을 위해 키워드 사용을 권장한다.
특히 상속 관계에서는 super
를 명시적으로 항상 사용한다
public class Animal {
String species;
public Animal(String animalSpecies) {
species = animalSpecies; // this 생략 가능
}
}
public class Dog extends Animal {
String breed;
public Dog(String dogBreed) {
super("개과"); // 부모 생성자 호출
breed = dogBreed; // this 생략 가능
}
}