클래스 정의
클래스는 객체 지향 프로그래밍의 기본 단위입니다. Java에서 클래스는 class
키워드를 사용하여 정의하며, 데이터와 그 데이터를 조작하는 메서드를 하나의 단위로 묶습니다. 클래스는 객체의 청사진 역할을 하며, 이를 통해 실제 객체(인스턴스)를 생성할 수 있습니다.
이번 글에서는 클래스 선언 방법, 클래스 이름 규칙, 필드와 메서드의 선언 및 사용, 생성자의 역할, 그리고 접근 제어자의 사용에 대해 자세히 살펴보겠습니다.
클래스 키워드 사용
클래스 키워드는 Java에서 새로운 클래스를 정의할 때 사용되는 핵심적인 키워드입니다. 클래스는 객체 지향 프로그래밍의 기본 단위이며, 데이터와 그 데이터를 조작하는 메서드를 하나의 단위로 묶는 데 사용됩니다.
클래스 선언 기본 구조
public class ClassName {
// 클래스 내용
}
여기서 className
은 개발자가 선택한 클래스 이름입니다.
클래스 키워드 사용 시 주의사항
- 대문자 사용: 클래스 이름은 일반적으로 대문자로 시작합니다. 이는 Java의 명명 규칙에 따라 권장되는 관행입니다.
- 단일 파일 규칙: Java에서는 하나의
.java
파일에 public 클래스가 하나만 존재해야 합니다. 또한 그 파일의 이름은 반드시 해당 public 클래스와 동일해야 합니다. - 접근 제어자: 클래스 선언 앞에
public
,default
,abstract
, 또는final
등의 접근 제어자를 사용할 수 있습니다. 가장 일반적인 것은public
입니다.
예시
다음은 간단한 Car
클래스의 선언 예시입니다:
public class Car {
private String brand;
private int year;
public Car(String brand, int year) {
this.brand = brand;
this.year = year;
}
public void honk() {
System.out.println("Beep!");
}
}
이 예시에서는 Car
라는 새로운 클래스를 정의했습니다. 이 클래스는 brand
와 year
필드를 가지고 있으며, 생성자와 honk()
메서드를 포함하고 있습니다.
클래스 이름 규칙
Java에서 클래스를 정의할 때는 특정한 규칙을 따라야 합니다. 이러한 규칙들은 코드의 가독성을 높이고 일관성을 유지하는 데 도움이 됩니다.
기본 규칙
- 대문자 사용: 클래스 이름은 항상 대문자로 시작해야 합니다.
- 카멜 케이스: 여러 단어로 구성된 클래스 이름은 각 단어의 첫 글자를 대문자로 사용합니다.
- 의미 있는 이름 사용: 클래스 이름은 해당 클래스의 목적이나 기능을 잘 설명해야 합니다.
- 숫자와 특수 문자 제한: 클래스 이름은 숫자로 시작할 수 없으며, 특수 문자를 포함할 수 없습니다. 언더바(_)와 달러 기호($)는 예외적으로 허용됩니다.
- Java 키워드 피하기: Java의 예약어나 키워드는 클래스 이름으로 사용할 수 없습니다.
예시
// 올바른 클래스 이름
public class Car {}
public class BankAccount {}
public class ComputerScienceStudent {}
// 잘못된 클래스 이름
public class car {} // 소문자로 시작
public class 123Class {} // 숫자로 시작
public class Class$ {} // 특수 문자 포함
public class int {} // Java 키워드 사용
클래스의 구성 요소(필드, 메서드, 생성자)
클래스는 세 가지 주요 구성 요소로 이루어져 있습니다. 필드, 메서드, 생성자입니다. 이들은 클래스의 구조와 동작을 정의하며, 객체 지향 프로그래밍의 핵심 요소입니다.
필드 (Fields)
필드는 클래스의 데이터 멤버로, 객체의 상태르 나타냅니다.
필드 선언
필드는 클래스 내부에서 선언되며, 다음과 같은 형식을 가집니다:
[접근 제어자] [타입] 필드명;
예시:
private int age;
public String name;
protected double salary;
필드 초기화
필드를 선언할 때 즉시 값을 할당할 수 있습니다:
private int age = 30;
public String name = "John Doe";
또는 생성자나 메서드 내에서 초기화할 수 있습니다.
필드 접근
필드는 클래스 내부에서 직접 접근할 수 있으며, 외부에서는 접근 제어자의 규칙에 따라 접근 가능합니다.
메서드 (Methods)
메서드는 객체의 동작을 정의하며, 특정 작업을 수행하는 코드 블록입니다.
메서드 선언
메서드는 다음과 같은 형식을 가집니다.
[접근 제어자] [반환 타입] 메서드명([매개변수 목록]) {
// 메서드 본문
}
예시:
public void sayHello() {
System.out.println("Hello!");
}
private int add(int a, int b) {
return a + b;
}
메서드 호출
메서드는 객체를 통해 호출됩니다:
MyClass obj = new MyClass();
obj.sayHello();
int result = obj.add(5, 3);
생성자 (Constructors)
생성자는 새로운 객체를 초기화하는 데 사용되는 특별한 메서드입니다.
기본 생성자
모든 클래스는 암시적으로 기본 생성자를 가지고 있습니다. 이는 매개변수가 없는 생성자입니다.
public MyClass() {}
매개변수 있는 생성자
클래스에 다른 생성자가 정의되어 있으면 명시적으로 기본 생성자를 선언해야 합니다.
public MyClass(String name) {
this.name = name;
}
public MyClass() {} // 명시적 기본 생성자 선언
생성자 오버로딩
생성자는 매개변수의 개수나 타입이 다르면 여러 개 정의할 수 있습니다.
public MyClass() {}
public MyClass(String name) {}
public MyClass(int age, String name) {}
예시 코드
다음은 위에서 설명한 구성 요소들을 모두 포함하는 간단한 Person
클래스 예시입니다:
public class Person {
// 필드
private String name;
private int age;
// 기본 생성자
public Person() {}
// 매개변수가 있는 생성자
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// 메서드
public void sayHello() {
System.out.println("Hello! My name is " + name);
}
public void growOlder() {
age++;
}
// getter와 setter 메서드
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
이 예시에서는 필드(name
과 age
)를 선언하고, 기본 생성자와 매개변수가 있는 생성자를 정의했습니다. 또한 sayHello()
와 growOlder()
라는 메서드를 구현했으며, 각 필드에 대한 getter와 setter 메서드도 포함했습니다.
클래스의 이러한 구성 요소들은 함께 작용하여 객체 지향 프로그래밍의 핵심 개념인 캡슐화, 추상화, 상속 등을 구현할 수 있게 해줍니다.
접근 제어자(public, private, protected, default)
Java의 접근 제어자는 클래스, 필드, 메서드의 접근 범위를 제어하는 데 사용됩니다. 이는 객체 지향 프로그래밍의 캡슐화 개념을 구현하는 중요한 도구입니다.
public
public
접근 제어자는 가장 넓은 범위의 접근을 허용합니다.
- 클래스: 패키지 내부와 외부 어디서나 접근 가능
- 필드와 메서드: 클래스 내부, 같은 패키지, 다른 패키지에서 모두 접근 가능
public class PublicClass {
public int publicField = 10;
public void publicMethod() {
System.out.println("This is a public method");
}
}
private
```private` 접근 제어자는 가장 좁은 범위의 접근을 허용합니다.
- 필드와 메서드: 해당 클래스 내부에서만 접근 가능
class PrivateExample {
private int privateField = 20;
private void privateMethod() {
System.out.println("This is a private method");
}
public void accessPrivate() {
System.out.println(privateField);
privateMethod();
}
}
protected
protected
접근 제어자는 같은 패키지 내의 클래스와 상속 관계에 있는 클래스에서 접근할 수 있도록 합니다.
- 필드와 메서드: 같은 패키지 내의 클래스와 상속 관계에 있는 클래스에서 접근 가능
class ProtectedParent {
protected int protectedField = 30;
protected void protectedMethod() {
System.out.println("This is a protected method");
}
}
class Child extends ProtectedParent {
public void accessProtected() {
System.out.println(protectedField);
protectedMethod();
}
}
default(package-private)
default
접근 제어자는 명시적으로 지정되지 않은 경우 적용됩니다.
- 클래스: 같은 패키지 내에서만 접근 가능
- 필드와 메서드: 같은 패키지 내의 클래스에서 접근 가능
class DefaultClass {
int defaultField = 40;
void defaultMethod() {
System.out.println("This is a default method");
}
}
class AnotherClassInSamePackage {
public void accessDefault() {
DefaultClass obj = new DefaultClass();
System.out.println(obj.defaultField);
obj.defaultMethod();
}
}
접근 제어자의 우선순위
- public > protected > default > private
접근 제어자의 사용 원칙
- 최소한의 접근 권한을 부여: 필요한 만큼만 공개하여 정보 은닉을 유지합니다.
- 필드는 private으로 선언: getter/setter 메서드를 통해 접근을 제어합니다.
- 메서드는 public으로 선언: 클래스의 기능을 외부에 노출합니다.
- 클래스는 public 또는 default로 선어: 패키지 구조에 따라 적절히 선택합니다.
예시 코드
다음은 다양한 접근 제어자를 사용한 예시 코드입니다:
public class AccessControlExample {
private int privateVar = 0;
protected int protectedVar = 1;
int defaultVar = 2; // default 접근
public int publicVar = 3;
private void privateMethod() {
System.out.println("Private method");
}
protected void protectedMethod() {
System.out.println("Protected method");
}
void defaultMethod() { // default 접근
System.out.println("Default method");
}
public void publicMethod() {
System.out.println("Public method");
}
public static void main(String[] args) {
AccessControlExample obj = new AccessControlExample();
// 같은 클래스 내부에서 모든 접근 가능
System.out.println(obj.privateVar);
System.out.println(obj.protectedVar);
System.out.println(obj.defaultVar);
System.out.println(obj.publicVar);
obj.privateMethod();
obj.protectedMethod();
obj.defaultMethod();
obj.publicMethod();
}
}
이 예제에서는 다양한 접근 제어자르 가진 필드와 메서드를 보여주고 있습니다. 같은 클래스 내부에서는 모든 접근이 가능하지만, 실제로는 최소한의 접근 권한을 부여하는 것이 좋습니다.
접근 제어자를 적절히 사용하면 코드의 안정성과 재사용성을 높일 수 있으며, 객체 지향 프로그래밍의 캡슐화 개념을 효과적으로 구현할 수 있습니다.
'JAVA' 카테고리의 다른 글
정수리터럴, 부동소수점 리터럴 [코딩백과 with JAVA] (1) | 2024.12.20 |
---|---|
리터럴과 원시 타입 변수 초기화 [코딩백과 with JAVA] (0) | 2024.12.20 |
원시 타입 변수란? [코딩백과 with Java] (0) | 2024.12.20 |
자바 변수 이해하기 - 코딩백과 with JAVA (0) | 2024.12.20 |
Part&Chapter 목록 | [Java The Complete Reference] 12th Edition - 재발자의 번역 프로젝트 (0) | 2024.11.08 |