- 클래스 정의하는 방법
- 객체 만드는 방법 (new 키워드 이해하기)
- 메소드 정의하는 방법
- 생성자 정의하는 방법
- this 키워드 이해하기
클래스란
클래스는 쉽게 설명하면 객체를 만들기 위한 틀
붕어빵은 하나의 객체로 이를 만들기 위한 붕어빵틀은 하나의 클래스로 설명할 수 있다.
이런 클래스는 class라는 키워드로 정의되며 각각 변수(속성)와 메서드(행위)를 가지게 된다.
클래스 요소
-
필드(field) - 필드는 해당 클래스 객체의 상태 속성을 나타내며, 멤버 변수라고도 불린다. 여기서 초기화하는 것을 필드 초기화 또는 명시적 초기화라고 한다.
- 인스턴스 변수 - 이름에서 알 수 있듯이 인스턴스가 갖는 변수이다. 그렇기에 인스턴스를 생성할 때 만들어진다. 서로 독립적인 값을 갖으므로 heap 영역에 할당되고 gc에 의해 관리된다.
- 클래스 변수 - 정적을 의미하는 static키워드가 인스턴스 변수 앞에 붙으면 클래스 변수이다. 해당 클래스에서 파생된 모든 인스턴스는 이 변수를 공유한다. 그렇기 때문에 heap 영역이 아닌 static 영역에 할당되고 gc의 관리를 받지 않는다. 또한 public 키워드까지 앞에 붙이면 전역 변수라 볼 수 있다.
-
메서드(method) - 메서드는 해당 객체의 행동을 나타내며, 보통 필드의 값을 조정하는데 쓰인다.
- 인스턴스 메서드 - 인스턴스 변수와 연관된 작업을 하는 메서드이다. 인스턴스를 통해 호출할 수 있으므로 반드시 먼저 인스턴스를 생성해야 한다.
- 클래스 메서드 - 정적 메서드라고도 한다. 일반적으로 인스턴스와 관계없는 메서드를 클래스 메서드로 정의한다.
- 생성자(constructor) - 생성자는 객체가 생성된 직후에 클래스의 객체를 초기화하는 데 사용되는 코드 블록이다. 메서드와 달리 리턴 타입이 없으며, 클래스엔 최소 한 개 이상의 생성자가 존재한다.
-
초기화 블록(initializer) - 초기화 블록 내에서는 조건문, 반복문 등을 사용해 명시적 초기화에선 불가능한 초기화를 수행할 수 있다.
- 클래스 초기화 블록 - 클래스 변수 초기화에 쓰인다.
-
인스턴스 초기화 블록 - 인스턴스 변수 초기화에 쓰인다.
클래스 변수 초기화: 기본값 → 명시적 초기화 → 클래스 초기화 블록
인스턴스 변수 초기화: 기본값 → 명시적 초기화 → 인스턴스 초기화 블록 → 생성자
클래스 정의
class Class { // 클래스
String constructor;
String instanceVar; // 인스턴스 변수
static String classVar; // 클래스 변수
static { // 클래스 초기화 블록
classVar = "Class Variable";
}
{ // 인스턴스 초기화 블록
instanceVar = "Instance Variable";
}
Class() { // 생성자
constructor = "Constructor";
}
void instanceMethod() { // 인스턴스 메서드
System.out.println(instanceVar);
}
static void classMethod() { // 클래스 메서드
System.out.println(classVar);
}
}
제어자 키워드
접근 제어자 - public, protected, default, private
그 외 - static, final, abstract, transient, synchronized, volatile etc.
- 접근 제어자 - 접근 제어자는 해당 클래스 또는 멤버를 정해진 범위에서만 접근할 수 있도록 통제하는 역할을 한다. 클래스는 public과 default밖에 쓸 수 없다. 범위는 다음과 같다. 참고로 default는 아무것도 덧붙이지 않았을 때를 의미한다.
- static - 변수, 메서드는 객체가 아닌 클래스에 속한다.
-
final
- 클래스 앞에 붙으면 해당 클래스는 상속될 수 없다.
- 변수 또는 메서드 앞에 붙으면 수정되거나 오버라이딩 될 수 없다.
-
abstract
- 클래스 앞에 붙으면 추상 클래스가 되어 객체 생성이 불가하고, 접근을 위해선 상속받아야 한다.
- 변수 앞에 지정할 수 없다. 메서드 앞에 붙는 경우는 오직 추상 클래스 내에서의 메서드밖에 없으며 해당 메서드는 선언부만 존재하고 구현부는 상속한 클래스 내 메서드에 의해 구현되어야 한다. 상속과 관련된 내용은 6주차에 다룰 예정이다.
- transient - 변수 또는 메서드가 포함된 객체를 직렬화할 때 해당 내용은 무시된다.
- synchronized - 메서드는 한 번에 하나의 쓰레드에 의해서만 접근 가능하다.
- volatile - 해당 변수의 조작에 CPU 캐시가 쓰이지 않고 항상 메인 메모리로부터 읽힌다.
객체 생성
public class Person {
private int age = 10;
private String name = "jun";
Person() {} // 기본 생성자
Person(int age, String name) {
setAge(age);
setName(name);
}
public int getAge() {
return age;
}
public String getName() {
return name;
}
public void setAge(int age) {
this.age = age;
}
public void setName(String name) {
this.name = name;
}
}
public static void main(String[] args) {
Person p1 = new Person();
Person p2 = new Person(15, "min");
}
new 연산자
new연산자는 클래스 타입의 인스턴스를 생성해주는 역할을 하는 연산자로 메모리(Heap 영역)에 공간을 할당받고 그 공간의 참조값을 객체에게 반환해주는 역할을 한다.
new 키워드는 새 객체에 메모리를 할당하고 해당 메모리에 대한 참조값을 반환하여 클래스를 인스턴스화한다.
일반적으로 객체가 메모리에 할당되면 인스턴스라 부른다
생성자 정의
Person() {} // 기본 생성자
Person(int age, String name) {
setAge(age);
setName(name);
}
생성자를 명시하지 않으면 컴파일러가 자동으로 기본 생성자를 생성한다.
하지만 기본 생성자가 아닌 다른 형태의 생성자만 생성했다면 기본 생성자는 생성되지 않는다.
this 키워드
public void setAge(int age) {
this.age = age;
}
public void setName(String name) {
this.name = name;
}
this키워드는 인스턴스 자신을 가르킨다. 위 코드에서 this를 사용함으로써 지역변수 age, name와 구분할 수 있다. 당연한 말이지만 클래스 (static)메서드에서는 this를 쓸 수 없다. 왜냐하면 인스턴스가 생성되지 않았을 수도 있기 때문이다.
this()는 해당 클래스 생성자를 호출할 수 있다. 그렇기 때문에 생성자를 재사용하는 데 쓰인다. (생성자 체이닝)
public class Person {
int age;
String name;
int height;
Person(int age, String name) {
this.age = age;
this.name = name;
}
Person(int age, String name, int height) {
this.age = age;
this.name = name;
this.height = height;
}
}
super 키워드
super의 경우 this와는 다르게 자식클래스가 부모클래스로부터 상속받은 멤버로를 사용하고자 할때 사용된다.
class Parent{
int a = 10;
}
class Child extends Parent{
int a = 20;
void childMethod(){
System.out.println(a); //20
System.out.println(this.a); //20
System.out.println(super.a); //10
}
}
super 키워드와 this 키워드의 기능이 비슷하 듯이 this()와 super() 키워드 역시도 기능이 비슷하다. super() 키워드는 this()와 마찬가지로 생성자를 호출하는 함수로, 자기자신이 아닌 부모클래스의 생성자를 호출한다.
'Java > Java 기본 및 이론' 카테고리의 다른 글
자바 primitive 와 Reference type 차이 및 사용 (0) | 2024.06.07 |
---|---|
자바 상속 (0) | 2021.03.07 |
[Java] 자바 기본 제어문 - 선택문, 반복문 (0) | 2021.01.11 |
[Java] junit5 설명 및 기본 사용 - junit4 와 5 비교 (0) | 2021.01.11 |
[Java] 자바의 연산자 (0) | 2021.01.07 |