클래스와 객체
- 캡슐화(encapsulation) : 객체를 캡슐로 싸서 내부를 볼 수 없게 하는 것
- 클래스(class): 객체 모양을 선언한 틀(캡슐화하는 틀)
- 객체(instance): 생성된 실체
- 메소드(method) : 함수
- 필드(field) : 변수
- 상속(inheritance)
- 상위 개체의 속성이 하위 개체에 물려짐
- 하위 개체가 상위 개체의 속성을 모두 가지는 관계
- 상위 클래스의 멤버를 하위 클래스가 물려받음
- 상위 클래스 : 수퍼 클래스(super class)
- 하위 클래스 : 서브 클래스(sub class), 수퍼 클래스 코드의 재사용, 새로운 특성 추가 가능
-
123456789101112class Animal{String name;int age;void eat(){}void love(){}}class Human extends Animal{String job;void work(){}void cry(){}}
- 클래스와 객체
- 클래스
- 객체의 속성(state)과 행위(behavior) 선언
- 객체의 설계도 혹은 틀
- 객체
- 클래스의 틀로 찍어낸 실체
- 프로그램 실행 중에 생성되는 실체
- 메모리 공간을 갖는 구체적인 실체
- 인스턴스(instance)라고도 부름
- 사례
- 클래스: 소나타자동차, 객체: 출고된 실제 소나타 100대
- 클래스: 벽시계, 객체: 우리집 벽에 걸린 벽시계들
- 클래스: 책상, 객체: 우리가 사용중인 실제 책상들
-
123456789101112131415161718192021public class Circle {int radius;String name;public double getArea() {return 3.14*radius*radius;}public static void main(String[] args) {Circle pizza;pizza = new Circle();pizza.radius = 10;pizza.name = "자바피자";System.out.println(pizza.name + "의 면적은 " + pizza.getArea());Circle donut = new Circle();donut.radius = 2;donut.name = "자바도넛";System.out.println(donut.name + "의 면적은 " + donut.getArea());}}
- 클래스
- 다형성(polymorphism)
- 같은 이름의 메소드가 클래스 혹은 객체에 따라 다르게 구현되는 것
- 다형성 사례
- 메소드 오버로딩(overloading) : 한 클래스 내에서 같은 이름이지만 다르게 작동하는 여러 메소드
- 한 클래스 내에서 두 개 이상의 이름이 같은 메소드 작성
- 메소드 이름이 동일하여야 함
- 매개 변수의 개수가 서로 다르거나, 타입이 서로 달라야 함
- 리턴 타입은 오버로딩과 관련 없음
- 메소드 오버라이딩(overriding) : 슈퍼 클래스의 메소드를 동일한 이름으로 서브 클래스마다 다르게 구현
- 메소드 오버로딩(overloading) : 한 클래스 내에서 같은 이름이지만 다르게 작동하는 여러 메소드
- 생성자(constructor)
- 객체가 생성될 때 초기화 목적으로 실행되는 메소드
- 객체가 생성되는 순간에 자동 호출
- 특징
- 생성자 이름은 클래스 이름과 동일
- 생성자는 여러 개 작성 가능(생성자 중복)
- 생성자는 객체 생성시 한 번만 호출
- 자바에서 객체 생성은 반드시 new 연산자로 함
- 생성자의 목적은 객체 생성 시 초기화
- 생성자는 리턴 타입을 지정할 수 없음
- 기본 생성자(default constructor)
- 매개 변수 없고, 아무 작업 없이 단순 리턴하는 생성자
- 디폴트 생성자라고도 불림
- 클래스에 생성자가 하나도 선언되어 있지 않을 때
- 컴파일러에 의해 기본 생성자 자동 생성
-
123456789101112131415161718192021222324252627public class Circle {int radius;String name;public Circle() {radius = 1;name = "";}public Circle(int r, String n) {radius = r;name = n;}public double getArea() {return 3.14*radius*radius;}public static void main(String[] args) {Circle pizza = new Circle(10, "자바피자");double area = pizza.getArea();System.out.println(pizza.name + "의 면적은 " + area);Circle donut = new Circle();donut.name = "도넛피자";area = donut.getArea();System.out.println(donut.name + "의 면적은 " + area);}}
- 클래스에 생성자가 선언되어 있는 경우
- 컴파일러는 기본 생성자를 자동 생성해 주지 않는다.
- this
- 객체 자신에 대한 레퍼런스
- 컴파일러에 의해 자동 관리, 개발자는 사용하기만 하면 됨
- this.멤버 형태로 멤버를 접근할 때 사용
- this()
- 같은 클래스의 다른 생성자 호출
- 생성자 내에서만 사용 가능
- 생성자 코드의 제일 처음에 있어야 함
-
12345678910111213public class Circle {int radius;public Circle() {this(1);}public Circle(int radius) {this.radius = radius;}double getArea() {return 3.14*this.radius*this.radius;}}
- 자바의 객체 배열
- 객체에 대한 레퍼런스 배열임
- 자바의 객체 배열 만들기 3 단계
- 배열 레퍼런스 변수 선언
- 레퍼런스 배열 생성
- 배열의 각 원소 객체 생성
- 가비지(garbage)
- 가리키는 레퍼런스가 하나도 없는 객체
- 더 이상 접근할 수 없어 사용할 수 없게 된 메모리
- 가리키는 레퍼런스가 하나도 없는 객체
- 가비지 켈렉션(garbage collection)
- 자바 가상 기계의 가비지 컬렉터가 자동으로 가비지 수집, 반환
- 자바 가상 기계가 가비지 자동 회수
- 가용 메모리 공간이 일정 이하로 부족해질 때
- 가비지를 수거하여 가용 메모리 공간으로 확보
- 가비지 컬렉터(garbage collector)에 의해 자동 수행
- 패키지(package)
- 상호 관련 있는 클래스 파일(컴파일된 .class)을 저장하여 관리하는 디렉터리
- 자바 응용프로그램은 하나 이상의 패키지로 구성
- 자바의 접근 지정자(access specifier)
- public 멤버
- 패키지에 관계 없이 모든 클래스에게 접근 허용
- private 멤버
- 동일 클래스 내에만 접근 허용
- 상속 받은 서브 클래스에서 접근 불가
- protected 멤버
- 같은 패키지 내의 다른 모든 클래스에게 접근 허용
- 상속 받은 서브 클래스는 다른 패키지에 있어도 접근 가능
- 디폴트(default) 멤버
- 같은 패키지 내의 다른 클래스에게 접근 허용
- public 멤버
- static 멤버
- static 멤버는 클래스당 하나만 생성
- 객체들에 의해 공유됨
- 활용
- 전역 변수와 전역 함수를 만들 때 활용
- 공유 멤버를 만들고자 할 때
- static으로 선언한 멤버는 클래스의 객체들 사이에 공유
- final
- final 클래스 – 더 이상 클래스 상속 불가능
- final 메소드 – 더 이상 오버라이딩 불가능
- final 필드, 상수 선언
- 상수를 선언할 때 사용
- 상수 필드는 선언 시에 초기 값을 지정하여야 한다
- 상수 필드는 실행 중에 값을 변경할 수 없다