전체 보기

[백기선 자바] 클래스

작성일자
2023/06/29
태그
SUB PAGE
프로젝트
백기선 자바
책 종류
1 more property

[자바 라이브 스터디] 5주차 - 클래스

목표) 자바가 제공하는 제어문을 학습합니다.
5
issues
클래스는 공식 문서 보고 키워드 사용법 제대로 이해하고 새롭게 업데이트 된 부분 공부하는 데에 초점 맞추기

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
복사
서로 관계가 깊은 경우가 많아 유기적으로 연결해주면 더 좋은 코드 얻을 수 있음
수정 필요할 때 적은 코드만 변경하면 되어 유지보수 쉬움