남궁성님의 Java의 정석(3rd Edition)을 보고 정리한 글입니다.
1. 클래스 생성과 구성
클래스는 인스턴스를 생성하기 위한 설계도이다.
클래스는 크게 변수 + 메서드로 구성된다.
a. 변수란?
- 변수는 쉽게 말해서 데이터(Value / Refernce)를 저장할 수 있는 저장공간이다.
- 변수는 선언위치에 따라 클래스 변수, 인스턴스 변수, 지역 변수로 나눌 수 있고, 이에 따라 사용가능한 스코프(영역)에 차이가 있다.
변수선언 예시
class Variables {
int iv; // 인스턴스 변수
static int cv; // 클래스 변수
void method() {
int lv = 0; // 지역 변수(메서드 내부에서만 사용)
}
}
public static void main(String args[]) {
Variables variables = new Variables();
variables.iv = 2; // 인스턴스 변수
variables.cv = 4; // 클래스 변수(권장x)
Variables.cv = 3; // 클래스 변수
}
클래스 변수 / 인스턴스 변수 / 지역 변수
변수의 종류 | 선언 위치 | 생성시기 | 소멸시기 |
클래스 변수 | 클래스 영역 | 클래스가 메모리에 올라갈 때 | 프로그램이 종료될 때 |
인스턴스 변수 | 클래스 영역 | 인스턴스 생성시 | 참조변수가 없을 때 가비지 컬렉터에 의해 자동 제거 |
지역 변수 | 메서드 영역 | 변수 선언문 수행시 | 메서드 종료될 때 |
- 클래스 변수는 인스턴스를 생성하지 않아도 사용할 수 있다.
- 멤버 변수 중 모든 인스턴스에 공통으로 사용하는 것을 클래스 변수로 사용한다
b. 메서드란?
- 어떤 특정 작업을 수행하기 위한 명령문의 집합이다.
- 어떤 값을 입력 받아서 처리하고 그 결과를 돌려준다. (입력받는 값이 없을 수도 있고 결과를 돌려주지 않을 수도 있다.)
- 메서드를 사용하면 재사용성, 중복 코드 제거, 구조화에 이점을 가져올 수 있다.
메서드 선언 방법 및사용 예시
// 메서드 정의하는 방법
반환타입 메서드명 (매개변수 선언) {
int result = x + y;
return result; // 결과 반환
}
// 메서드 정의 예시
// 반환타입이 없으면 void
int add (int x, int y) {
int result = x + y;
return result;
}
// 메서드 호출하는 방법
메서드명(인자);
// 메서드 호출 예시
int result = add(3, 5);
매개변수와 인자
- 매개변수는 메서드가 작업을 수행하는데 필요한 값들(입력)을 제공받기 위한 것이다.
- 인자는 메서드를 호출할 때 괄호( ) 안에 지정해준 값들이다.
- 인자의 개수와 타입, 순서는 호출 메서드에 선언된 매개변수와 일치해야 한다.
return 문
- 현재 실행 중인 메서드를 종료하고 호출한 메서드로 돌아간다.
- 반환타입이 없는 경우(void)를 제외하면 모드 return문이 있어야 한다.
- void에서도 return문을 만나면 즉시 메서드를 종료하고 호출한 메서드로 돌아간다.
메서드는 static 여부에 따라 클래스 메서드와 인스턴스 메서드로 구분할 수 있다.
클래스 메서드와 인스턴스 메서드
- static 멤버들은 인스턴스 멤버들을 참조할 수 없다.
- static 메서드는 프로그램 종료시까지 어디서 사용할 수 있지만, 인스턴스도 생성되지 않았는데, 인스턴스 멤버를 참조하는 것 자체가 성립될 수 없다.
클래스 메서드와 인스턴스 메서드 사용 예시
class TestClass {
static int cv;
int iv;
void instanceMethod1() {}
static void staticMethod1() {}
void instanceMethod2() {
instanceMethod1();
staticMethod1();
}
static void staticMethod2() {
staticMethod1();
instanceMethod1(); // 에러(인스턴스 메서드를 호출할 수 없다.)
System.out.println(cv);
System.out.println(iv); // 에러(인스턴스 변수를 사용할 수 없다.)
}
}
2. 인스턴스 생성과 사용
인스턴스는 클래스를(설계도) 기반으로 실제 메모리상에 로딩된다.
인스턴스를 생성할 때 new 키워드를 사용하면 된다.
인스턴스 생성 방법: 클래스명 참조변수명 = new 클래스명();
인스턴스 생성과 사용 예시
class TvTest {
public static void main(String args[]) {
Tv t1 = new Tv(); // Tv 인스턴스 생성
Tv t2 = new Tv(); // Tv 인스턴스 생성
System.out.println("t1의 channel값은 " + t1.channel + "입니다.");
System.out.println("t2의 channel값은 " + t2.channel + "입니다.");
t1.channel = 7; // channel 값을 7으로 한다.
System.out.println("t1의 channel값을 7로 변경하였습니다.");
System.out.println("t1의 channel값은 " + t1.channel + "입니다.");
System.out.println("t2의 channel값은 " + t2.channel + "입니다.");
}
}
class Tv {
// Tv의 속성(멤버변수)
String color; // 색상
boolean power; // 전원상태(on/off)
int channel; // 채널
// Tv의 기능(메서드)
void power() { power = !power; } // TV를 켜거나 끄는 기능을 하는 메서드
void channelUp() { ++channel; } // TV의 채널을 높이는 기능을 하는 메서드
void channelDown() { --channel; } // TV의 채널을 낮추는 기능을 하는 메서드
}
실행결과
t1의 channel값은 0입니다.
t2의 channel값은 0입니다.
t1의 channel값을 7로 변경하였습니다.
t1의 channel값은 7입니다.
t2의 channel값은 0입니다.
- 인스턴스는 참조변수를 통해서만 다룰 수 있으며, 참조변수의 타입은 인스턴스의 타입과 일치해야 한다.
객체 배열
- 객체를 배열 형태로 다룰 수 있다. 예제를 통해서 보여주겠다.
class TvTest {
public static void main(String args[]) {
Tv[] tvArr = new Tv[3]; // 길이가 3인 Tv 객체 배열
// Tv 객체를 생성해서 Tv객체 배열의 각 요소에 저장
for (int i = 0; i < tvArr.length; i++) {
tvArr[i] = new Tv();
tvArr[i].channel = i + 10;
}
}
}
지금까지 클래스, 객체, 인스턴스에 대해서 정리하고, 클래스와 인스턴스를 생성해서 사용하는 방법에 대해서 정리해보았다.
'Programming > Java' 카테고리의 다른 글
[Java] ProcessBuilder로 시스템 명령어 수행하기 (0) | 2024.10.08 |
---|---|
[Java] 스트림(Stream) (0) | 2023.12.10 |
[Java] 쓰레드(Thread) - 6(쓰레드 동기화) (0) | 2023.12.10 |
[Java] 쓰레드(Thread) - 5(쓰레드 상태와 실행제어) (0) | 2023.12.10 |
[Java] 쓰레드(Thread) - 4(데몬 쓰레드) (0) | 2023.12.10 |