[Java] 클래스와 객체
참고 : 명품 JAVA Programming (개정 4판) 저자 황기태, 김효수
- 객체 지향 언어의 특성
- 캡슐화(Encapsulation) : 객체를 캡슐로 싸서 내부를 보호하고 볼 수 없게 하는 것 → 외부의 접근으로부터 안전,
클래스라는 캡슐을 사용하고 필드(멤버 변수)와 매서드(멤버 함수)로 구성
- 상속(Inheritance) : 상위 객체의 속성이 하위 개체에 물려져서, 하위 개체가 상위 개체의 속성을 모두 가지는 관계, 자바에서는 자식 클래스가 부모 클래스의 속성을 물려받고 기능을 확장(extens)하는 개념
- 다형성(Polymorphism) : 같은 이름의 메소드가 클래스 혹은 객체에 따라 다르게 동작하도록 구현되는 것
- 매소드 오버라이딩(Overriding) : 슈퍼 클래스(부모 클래스)에 구현된 매소드를, 서브 클래스(자식 클래스)에서 동일한 이름으로 자신의 특징에 맞게 다시 구현하는 것
- 매소드 오버로딩(Overloading) : 클래스 내에서 이름이 같지만 서로 다르게 동작하는 매소드를 여러 개 만드는 매소드
- 클래스 구성
- class 키워드를 사용하여 선언
- 클래스 구성요소를 멤버라고 부르며, 멤버는 필드(멤버 변수)와 메소드(멤버 함수) 두 가지 종류가 있음
ex)
public class Circle {
int radius; String name;
}
- class 키워드 사용하여 Circle 클래스 선언
- 중괄호 안에 필드와 메소드 모두 작성
- 클래스 외부에 어떤 필드나 메소드 위치 불가
- public : 접근지정자
- 생성자 : 클래스 이름과 동일한 메소
- 객체 생성과 객체 접근
Circle pizza;
pizza = new Circle();
- new 연산자를 사용하여 객체 생성
- 객체의 멤버 접근할 때는 레퍼런스 변수 뒤에 .연산자를 붙임
- 생성자(constructor)
- 객체가 생성될 때 객체의 초기화를 위해 실행되는 메소드
- 생성자의 이름은 클래스 이름과 동일
- 생성자는 여러 개 작성(오버로딩) 가능
- 생성자는 new를 통해 객체를 생성할 때 한 번만 호출
- 생성자에 리턴 타입 불가
- 사용하는 목적은 객체가 생성될 때 필요한 초기 작업을 하기 위함
- 기본 생성자(default constructor)
- 매개변수와 실행 코드가 없어 아무 일도 하지 않는 단순 리턴하는 생성자 , 디폴트 생성자라고도 함
- 기본 생성자가 자동으로 생성되는 경우 → 컴파일러에서 자동으로 생성됨
- 기본 생성자가 자동으로 생성되지 않는 경우 → 매개변수를 가진 생성자가 작성되어 있기 때문에, 컴파일러는 기본 생성자를 만들어 주지 않음
- this
- 현재 객체 자신에 대한 레퍼런스
- this 사용하는 이유는 매개변수의 이름은 그 자체로서 코드를 읽는 사람에게 그 용도를 나타내므로 적합한 이름을 붙이는 것이 중요
- this()
- 클래스 내에서 생성자가 다른 생성자를 호출할 때 사용하는 자바 코드
- this() 사용 시 주의 사항
- 반드시 생성자 코드에서만 호출 가능
- 반드시 같은 클래스 내 다른 생성자를 호출할 때 사용
- 반드시 생성자의 첫 번째 문자가 되어야 함
- 객체 배열
- 객체에 대한 레퍼런스를 원소로 갖는 배열
- 메소드 활용
- 메소드 : 클래스의 멤버 함수
- call by value : 호출하는 실인자의 값이 복사되어 매소드의 매개변수에 전달됨
- 기본 타입의 값이 전달되는 경우 : 기본 타입(byte, char, short, int, long, float, double, boolean)으로 선언된 경우,
호출자가 건네는 값이 매개변수에 복사 - 객체가 전달되는 경우 : 매개변수가 클래스 타입인 경우, 객체가 아니라 객체의 레퍼런스 값이 전달
- 배열이 전달되는 경우 : 배열이 통째로 전달되는 것이 아닌 배열에 대한 레퍼런스만 전달
※ 메소드의 매개변수로 객체나 배열을 전달할 때 레퍼런스만 전달하기 때문에 객체나 배열이 통째로 전달되지 않음
→메소드에서 전달받은 객체의 필드나 배열의 원소값을 변경할 수 있기 때문에 주의!
- 메소드 오버로딩
- 한 클래스 내에 이름이 같지만 매개변수의 타입이나 개수가 서로 다른 여러 개의 매소드를 중복 작성하는 것
- 메소드 오버로딩 조건
- 메소드 이름이 동일
- 매개변수의 개수나 타입이 서로 달라야 함
- 접근 지정자
- 패키지 : 디렉터리 혹은 폴더 같은 개념, 클래스 파일들을 여러 패키지에 분산하여 관리
- 접근 지정자 종류
멤버에 접근하는 클래스 | 멤버의 접근지정자 | |||
private | default | protected | public | |
같은 패키지의 클래스 | X | O | O | O |
다른 패키지의 클래스 | X | X | X | O |
접근 가능 영역 | 클래스 내 | 동일 패키지 내 | 동일 패키지와 자식 클래스 |
모든 클래스 |
- static 멤버
- 클래스 하나당 하나만 생성되는 멤버로서 동일한 클래스의 모든 객체들이 공유
- non-static멤버 vs static 멤버
non - static 멤버 | static 멤버 | |
선언 | class Sample{ int n; void g() {...} } |
class Sample{ static int m; static void g() {...} } |
공간적 특성 | 멤버는 객체마다 별도 존재(인스턴스 멤버) | 멤버는 클래스당 하나 생성(클래스 멤버) |
시간적 특성 | 객체 생성 시에 멤버 생성됨 | 클래스 로딩 시에 멤버 생성 |
공유의 특성 | 공유되지 않음 | 동일한 클래스이 모든 객체들에 의해 공유됨 |
- static 메소드의 제약조건
- static 멤버만 접근 가능
- this 사용 불가
- final
- final 키워드는 3 군데서 사용됨
- 클래스 이름 앞에 사용되면 클래스를 상속받을 수 없음을 지정
- 메소드를 선언하면 오버라이딩할 수 없는 메소드임을 선언
- 필드를 선언하면 필드는 상수가 됨
'Study > Java' 카테고리의 다른 글
[Java] 모듈과 패키지, 자바의 기본 패키지 (0) | 2022.06.22 |
---|---|
[Java] 상속과 인터페이스 (0) | 2022.06.04 |
[Java] 예외처리 (0) | 2022.05.17 |
[Java] 배열 (0) | 2022.05.17 |
[Java] 반복문 (0) | 2022.05.17 |