Class05(클래스)
2022. 12. 29. 수업내용 정리
클래스
클래스
- 클래스(Class)는 서로 관련있는 멤버(Member)를 포함하기 위한 존재이다.
- 클래스의 명명은 파스칼 케이스를 이용하고, 단수형 명사를 이용한다.
[접근 제한자] [abstract]? class [클래스 이름] [extends [부모 클래스 이름]]? [implements [인터페이스 이름,...]]? { }
public class First { }
위 클래스의 접근 제한자는
public
이고, 추상적이지 않으며 이름은First
이다. 별도로 상속(Inheritance) 및 구현(Implementation)이 언급되어 있지 않다. - 접근 제한자가
public
인 클래스는 그 클래스 코드를 포함하는 파일의 실제 이름과 동일해야 한다. - 클래스가 내부에 포함하고 있을 수 있는 대상은 많지만 주로 멤버 변수(Member Variable)와 메서드(Method)가 주류를 이룬다.
객체화(Instantiation)
- 어떠한 타입에(주로 클래스)에 대한 독릷적인 객체(값)를 생성하기 위해 사용한다.
- 클래스 객체화 시 클래스가 멤버로 가지고 있는 비정상적인 모든 것이 새롭게 생기게(초기화 혹은 객체화) 된다.
[타입] [변수 이름] = new [타입] [생성자 호출부];
T t = new T(); //String name = new String(); 문자열 타입의 객체 생성..
Country korea = new Country(); korea.name = "대한민국"; korea.population = 51_740_000; korea.area = 100_210D; Country germany = new Country(); // 객체 germany.name="독일"; germany.population = 83_130_000; germany.area = 357_588D;
변수가 호출되는 과정….(기본타입.. 참조타입.. 클래스..)
Country korea = new Country(); korea.name = "대한민국"; korea.population = 51_740_000; korea.area = 100_210D; Country germany = new Country(); // 객체 germany.name="독일"; germany.population = 83_130_000; germany.area = 357_588D; System.out.println(korea.name+"의 면적당 인구는 "+korea.population/korea.area+"(명/㎢)입니다."); /* 1. country class 내부에 있는 멤버 변수에 접근(호출) 2. 일단, class 타입이 저장된 STACK 메모리 영역에 접근, 이 때 아래 그림을 보면 HEAP 메모리 공간에서 ax00 을 가리키므로 해당 주소로 이동! 3. ax00 으로 이동해보니 각 멤버변수별로 저장된 주소를 가리킴.. STACK으로 이동한 후 기초 타입(원시 타입)의 경우 이 주소에 값이 저장되어 있으므로 저장된 값을 불러옴.. 참조 타입의 경우 HEAP 영역 내 저장된 주소를 가리키는데 아래의 그림에서는 '대','한','민','국' 각각에 저장된 주소의 범주를 가리키는 것을 확인할 수 있다. */ System.out.println(germany.name+"의 면적당 인구는 "+germany.population/korea.area+"(명/㎢)입니다.");
생성자(Constructor)
- 생성자(Constructor)는 어떠한 클래스를 객체화할 때 반드시 한 번 실행이 되는 일종의 메서드이다. 단, 생성자는 임의로 호출할 수는 없다.
- 어떠한 클래스 내에 그 어떤 생성자도 명시하지 않은 경우 기본 생성자가 있는 것으로 간주한다. 기본 생성자는 매개 변수가 없고, 호출부의 구문은 부모 생성자 호출)(
super()
) 하나로 이루어져 있다.public [클래스 이름](){ super(); }
- 생성자는 정적일 수 없고, 반환 타입이 없으며(선택 사항이 아님으로
void
로 명시하지도 않는다.) 구현부의 첫 구문은 반드시 부모 혹은 생성자 호출이어야만 한다.
캡슐화(Encapsulation)
- 캡슐화(Encapsulation)는 어떤 클래스가 가지는 멤버 변수의 접근 제한자를 (상수가 아닌한)
private
으로 막고, 이에 접근하기 위한 Getter 및 Setter 메서드를 만드는 것을 의미한다. - 멤버 변수에 직접 값을 대입할 때에는 특정 로직을 실행시킬 수 없으나, Setter 메서드를 통해 값 대입을 대리하게 하면 특정 로직을 실행시킬 수 있음으로 올바르지 않은 값의 대입을 막을 수 있다.
- 즉, 개발자간의 협동의 용이 및 실수의 방지를 위해 대부분의 필드를 가지는 클래스(Entity,DTO,VO 등)는 캡슐화되어 있다.
- 읽기 전용(상수,
final
)의 경우 캡슐화를 하기도 하지만 안 해도 상관 없다.(어차피 값 대입이 안되니) 단, 값이 찹조될 때 마다 특정 로직을 작성해야 한다면 읽기 전용이라 하더라도 Getter 메서드를 만드는 경우가 있다. - 정적인 읽기 전용(
statci final
)의 캡슐화를 하지 않는다.(하면 안 된다.)
상속(Inheritance)
- 기존에 존재하는 최종적이지 않은(
final
가 아닌)클래스의 기능을 그대로 가지고 추가적인 기능을 구현하기 위해 클래스를 상속받을 수 있다. - 상속 받을 수 있는 클래스의 개수는 한 개로 제한된다.
- 클래스 간의 상속 구조가 순환 상속(Circular Inheritance) 구조가 되어서는 안 된다.
public class Child extends Parent { // ... }
위 구조에서 클래스
child
는 클래스Parent
를 상속 받는다고 한다. - 별도의 상속 대상을 명시하지 않는다면
object
클래스를 상속받게 된다.
댓글남기기