[자바 라이브 스터디] 5주차 - 클래스
•
1. 클래스 정의하는 방법
•
정의) 객체를 생성하기 위한 틀
◦
데이터와 함수의 결합
◦
사용자 정의 타입
•
특징)
◦
접근지정자
클래스 내부 | 동일 패키지 | 하위 클래스 | 그 외 영역 | |
public | O | O | O | O |
protected | O | O | O | X |
default (생략 가능) | O | O | X | X |
private | O | X | X | X |
◦
선언 위치에 따른 변수 종류
class Variables
{
int iv; // 인스턴스 변수 (힙 영역)
static int cv; // 클래스 변수 (메서드 영역)
void method() {
int lv = 0; // 지역변수 (스택 영역)
}
}
Java
복사
◦
멤버 변수
▪
인스턴스 변수
•
각 인스턴스마다 고유한 값 가짐
▪
클래스(static) 변수
•
모든 인스턴스에 공통된 값 유지해야 한다면 static 붙여서 사용
•
클래스이름.클래스변수 형식으로 사용 (객체생성 전 사용 가능)
◦
멤버 변수의 초기화
▪
정의) 지역변수와 달리 초기화 안 한 채 사용해도 컴파일 에러 x
•
타입의 기본값으로 초기화됨
▪
종류)
1.
명시적 초기화 → 변수 선언과 동시에 초기화
2.
생성자
3.
초기화 블럭
•
클래스 초기화 블럭 → 클래스 변수의 복잡한 초기화에 사용됨
◦
클래스가 메모리에 처음 로딩될 때 한번만 수행됨
class Person {
static { ... } // 클래스 초기화 블럭
}
Java
복사
•
인스턴스 초기화 블럭 → 인스턴스 변수의 복잡한 초기화에 사용됨
◦
생성자와 같이 인스턴스 생성할 때마다 수행됨(생성자보다 먼저 수행됨)
class Person {
{ ... } // 인스턴스 초기화 블럭
}
Java
복사
◦
사용)
▪
모든 생성자에 공통으로 수행되어야 하는 문장들을 있을 때
▪
배열이나 예외처리와 같이 복잡한 초기화 작업해야 할 때
◦
장점) 재사용성 높이고 중복 제거함 → 객체지향프로그래밍적 요소
◦
클래스 명명 규칙
//가능
class Person {} // 첫 문자가 문자나 '_', '$'의 특수문자로 시작해야 함
class _Person {}
//불가능
class @Person {} // '_', '$' 외의 특수문자로 시작 불가
class 1Person {} // 숫자로 시작 불가
class new {} // 키워드 불가
class One Person {} // 공백 포함 불가
Java
복사
2. 객체 만드는 방법 (new 키워드 이해하기)
•
객체
◦
방법)
클래스명 변수명; // 참조변수 선언
변수명 = new 클래스명(); // 클래스 객체 생성 후, 객체 주소를 참조변수에 저장
Java
복사
•
객체 배열
◦
방법 1)
클래스명[] 변수명 = new 클래스명[n]; // 각 요소는 참조변수의 기본값인 null로 초기화됨
for(int i=0; i<변수명.length; i++) {
변수명[i] = new 클래스명(); // 객체 생성해서 배열의 각 요소에 저장
}
Java
복사
◦
방법 2)
클래스명[] 변수명 = new 클래스명[n]; // 각 요소는 참조변수의 기본값인 null로 초기화됨
클래스명[] 변수명 = {new 클래스명(), new 클래스명(), new 클래스명()};
// 객체 생성해서 배열의 각 요소에 저장
Java
복사
3. 메소드 정의하는 방법
•
정의)
반환타입 메서드이름 (타입 변수명, 타입 변수명, ...) // 선언부
{
... // 구현부
}
메서드이름(값1, 값2, ...) // 호출
Java
복사
•
특징)
◦
매개변수
▪
기본형 매개변수 (read only) → 값 복사
▪
참조형 매개변수 (read & write) → 주소 복사
◦
반환타입
▪
참조형 반환타입 →객체의 주소를 반환
◦
static(클래스) 메서드와 인스턴스 메서드
▪
인스턴스 메서드
•
인스턴스 변수를 필요로 하는 메서드
▪
static 메서드
•
인스턴스와 관계 없는(인스턴스 변수나 메서드를 사용하지 않는) 메서드에 보통 사용함
•
예시) Math 클래스의 메서드는 모두 static 메서드임
▪
특징)
•
static 메서드는 static 변수처럼, 객체 생성하지 않고도 클래스이름.메서드이름(매개변수) 꼴로 호출 가능
•
같은 클래스 내의 메서드끼리 서로 호출가능하지만, static 메서드는 같은 클래스 내의 인스턴스 메서드 호출 불가
◦
JVM 구조
▪
메서드 호출되면, 스택 영역에 메서드를 위한 메모리 할당됨
▪
메서드가 작업 수행하는 동안, 지역변수들과 연산 중간경로 등 저장함
▪
메서드가 작업 마치면, 할당되었던 메모리 공간은 반환되어 비워짐
▪
예시)
•
a()를 실행하다 b()를 실행하면, 스택에서 a()의 작업 공간 바로 위해 b()의 작업 공간 생김
•
b() 수행 마치면, 제공되었던 스택의 메모리 공간이 반환되고, a()가 다시 수행 계속 하게 됨
•
이때, b()의 반환값은 대기상태에 있던 a()한테 넘겨줌
◦
오버로딩
▪
정의) 한 클래스 내에 같은 이름의 메서드를 여러 개 정의하는 것
•
이름 같아도 매개변수의 개수 또는 타입이 다르면 정의 가능
•
반환 타입은 아무 영향 x
▪
특징)
•
이름 짓기 편하고 같은 기능 한단 거 예측하기 쉬움
•
가변인자
◦
정의) 매개 변수 개수를 동적으로 지정하는 기능
▪
타입… 변수명 형태로 매개변수 중 가장 마지막에 선언
4. 생성자 정의하는 방법
•
정의) 인스턴스 (변수) 초기화 메서드
클래스이름(타입 변수명, 타입 변수명, ...) {
}
Java
복사
•
특징)
◦
생성자가 호출되는 시점
▪
연산자 new에 의해 메모리에 클래스의 인스턴스가 생성된 후,
▪
생성자가 호출되어 실행되고,
▪
연산자 new의 결과로 생성된 인스턴스의 주소가 반환되어 참조변수에 저장됨
◦
기본 생성자가 추가되는 시점
▪
컴파일할 때, 소스파일(.java)의 클래스에 생성자가 하나도 정의되지 않은 경우 컴파일러가 자동적으로 기본 생성자 추가해 컴파일함
5. this 키워드 이해하기
•
this
◦
정의) 인스턴스 자신을 가리키는 참조변수
▪
인스턴스의 주소가 저장되어 있음
▪
생성자 포함한 모든 인스턴스 메소드에 지역변수로 숨겨진채로 존재함
◦
사용)
▪
생성자의 매개변수로 선언된 변수 이름이 인스턴스 변수이름과 같은 경우 이름만으로 두 변수 서로 구별 안되기에 인스턴스 변수 앞에 this를 사용해 구별
◦
특징)
▪
this를 사용할 수 있는 것은 인스턴스 멤버뿐.
▪
static 메서드에선 this 사용 불가
•
this()
◦
정의) 같은 클래스의 다른 생성자 호출할 때 사용하는 생성자
◦
조건)
▪
호출할 때 다른 생성자 이름으로 클래스이름 대신 this 사용
▪
다른 생성자 호출은 반드시 첫 줄에서만 가능
•
다른 생성자에서 매개 변수 초기화하면 현재 생성자의 매개 변수 초기화가 의미 없어질 수 있어서
◦
장점)
▪
코드 더 간략하게 할 수 있음
Person() {
this("child", "male", 10);
} // Person p = new Person(); 만으로 인스턴스 변수 초기화 가능해짐
Java
복사
▪
서로 관계가 깊은 경우가 많아 유기적으로 연결해주면 더 좋은 코드 얻을 수 있음
▪
수정 필요할 때 적은 코드만 변경하면 되어 유지보수 쉬움