클래스와 객체
그림은 "명품 자바프로그래밍" 책을 참고하였습니다.
4장. 클래스와 객체
1. 자바의 특징
1) 절차 지향 프로그래밍
▶ 작업 순서를 표현하는 컴퓨터 명령 집합
▶ 함수들의 집합으로 프로그램 작성
2) 객체 지향 프로그래밍
▶ 프로그램을 실제 세상에 가깝게 모델링
▶ 컴퓨터가 수행하는 작업을 객체들 간의 상호 작용으로 표현
3) 캡슐화
▶ 메소드(함수)와 데이터를 클래스 내에 선언하고 구현
▶ 외부에서는 공개된 메소드의 인터페이스만 접근 가능
▶ 외부에서는 비공개 데이터에 직접 접근하거나 메소드의 구현 세부를 알 수 없음
▶ 객체 내 데이터에 대한 보안, 보호, 외부 접근 제한
4) 다형성
▶ 동일한 이름의 기능이 서로 다르게 작동하는 현상
▶ 자바의 다형성 사례
- 슈퍼 클래스의 메소드를 서브 클래스마다 다르게 구현하는 메소드 - 오버라이딩
- 한 클래스 내에 구현된 동일한 이름이지만 다르게 작동하는 여러 메소드 - 오버로딩
5) 클래스
▶ 클래스 외부에는 어떤 필드나 메소드도 존재불가(캡슐화의 원칙)
▶ 객체의 속성과 행위 선언
▶ 객체의 설계도 혹은 틀
▶ 필드, 메소드, 생성자로 구성
6) 객체
▶ 클래스의 틀로 찍어낸 실체
▶ 메모리 공간을 갖는 구체적인 실체
▶ 클래스를 구체화한 객체를 인스턴스(instance)라고 부름
7) 클래스 접근 지정자
▶ 다른 클래스들에서 이 클래스를 사용하거나 접근할 수 있음을 선언(생략 시 default)
8) 선언
▶ class Person은 Person이라는 이름의 클래스 선언
9) 필드(field)
▶ 값을 저장할 멤버 변수
10) 생성자(constructor)
▶ 클래스의 이름과 동일한 메소드
▶ 클래스의 객체가 생성될 때만 호출되는 메소드
▶ return 값이 없을 때
▶ 필드를 초기화 및 꼭 필요한 작업을 위해 두는 것
11) 메소드(method)
▶ 메소드는 함수이며 객체의 행위를 구현
▶ 메소드의 접근 지정자 public
- 메소드를 다른 클래스의 메소드에서 호출할 수 있도록 공개한다는 의미
12) 객체 생성 과정
[1] 객체에 대한 레퍼런스 변수 선언
- 레퍼런스 변수 선언했다고 객체가 생성되지 않음
- 이것은 변수 aPerson은 Person 클래스의 객체에 대한 주소, 즉 레퍼런스를 가지는 변수일 뿐이며 객체가 아님
- 레퍼런스 변수만 생기고 NULL로 초기화
[2] Person 객체 생성
- Person 타입 크기의 메모리 할당
- Person( ) 생성자 코드 실행
public static void main(String args[]) { Person p; //레퍼런스 변수 p생성 p = new Person("d4tail"); //Person 객체 생성 p.age = 30; //Person 타입 객체 p의 멤버 age에 접근 String s = p.getName(); //객체 p의 메소드 getName() 호출 }
13) 객체 멤버 접근 [ ex) aPerson.age = 30; ]
▶ 레퍼런스 변수 뒤에 .(점) 연산자를 붙여서 접근
14) 객체 배열 생성과정
15) 메소드 형식
▶ 자바의 모든 메소드는 반드시 클래스 안에 있어야 함(캡슐화 원칙)
16) 객체 혹은 배열을 전달하는 경우 (call by reference)
▶ 객체나 배열의 레퍼런스만 전달
▶ 객체 혹은 배열이 통째로 복사되어 전달되는 것이 아님
▶ 메소드의 매개 변수와 호출한 실인자가 객체나 배열을 공유하게 됨
▶ ex) 출력결과를 쓰시오.
17) 오버라이딩 - 다형성
▶ 슈퍼클래스에 구현된 메소드를 서브클래스에서 동일한 이름으로 자신의 특징에 맞게 다시 구현
18) 오버로딩(매개변수가 기준[개수, 타입]) - 다형성
▶ 한 클래스 내에서 두 개 이상의 이름이 같은 메소드 작성 ▶ 메소드 이름이 동일하여야 함
▶ 매개 변수의 개수가 서로 다르거나, 타입이 서로 달라야 함
▶ 리턴 타입은 오버로딩과 관련 없음
19) this (객체 자신에 대한 레퍼런스) 란?
▶ 현재 실행되는 메소드가 속한 객체에 대한 레퍼런스
▶ 컴파일러에 의해 자동 선언 : 별도로 선언할 필요 없음
20) this의 필요성
▶ 객체의 멤버 변수와 메소드 변수의 이름이 같은 경우
▶ 다른 메소드 호출 시 객체 자신의 레퍼런스를 전달
▶ 메소드가 객체 자신의 레퍼런스를 반환할 때
21) 생성자(메소드 중 클래스와 이름이 동일)의 특징
▶ 생성자는 new를 통해 객체를 생성할 때만 호출됨
▶ 생성자는 하나 이상 선언되어야 함
▶ 개발자가 생성자를 작성하지 않았으면 컴파일러에 의해 자동으로 기본 생성자가 선언됨
▶ 기본 생성자를 디폴트 생성자라고도 함
▶ 생성자 이름은 클래스 이름과 동일
▶ 생성자도 오버로딩하여 여러 개 작성 가능
▶ 생성자는 리턴 타입을 지정할 수 없음
=>그러나 return문을 사용할 수는 있다.
▶ 생성자의 목적은 객체가 생성될 때 초기작업을 위함
=>필드초기화, 필요한 메모리 확보, 파일열기, 네트워크 연결
22)기본 생성자(default constructor)
▶ 클래스에 생성자가 하나도 선언되지 않은 경우
▶ 컴파일러에 의해 자동으로 생성
▶ 매개 변수 없는 생성자
▶ 아무 작업 없이 단순 리턴
▶ Default 생성자라고도 부름
▶ 클래스에 생성자가 하나라도 존재하면 기본 생성자가 자동 삽입되지 않음
ex) 기본생성자가 자동으로 생성되지 않은 경우는?
▶ 생성자가 하나라도 존재하는 클래스에는 기본생성자를 삽입해주지 않음
▶ 오류나지 않으려면 기본생성자 삽입
23) this() - Static 메소드에서는 사용 불가
▶ 같은 클래스의 다른 생성자 호출 시 사용 - 사용목적
▶ 생성자 내에서만 사용(다른 메소드에서 사용 불가)
▶ 반드시 생성자 코드의 제일 처음에 수행
24) 객체치환
▶ 객체가 레퍼런스 됨을 의미
▶ 같은 곳을 가리킨다는 뜻 (A = B)
▶ 객체를 복사하는 것이 절 때 아님
25) 객체배열
▶ Circle[] c = new Circle[5]; //각 방 레퍼런스 변수
▶ c[i] = new Circle( ); //for문으로 반복
▶ c[i].name , c[i].get()
26) 객체 소멸
▶ new에 의해 생성된 객체 메모리를 자바 가상 기계로 되돌려 주는 행위[반납]
▶ 소멸된 객체 공간은 가용 메모리에 포함
▶ 자바 응용프로그램에서 임의로 객체 소멸할 수 없음
▶ 객체 소멸은 자바 가상 기계의 고유한 역할
▶ 자바 개발자에게는 매우 다행스러운 기능
▶ C/C++에서는 개발자가 프로그램 내에서 삭제
27) 가비지
▶ 가리키는 레퍼런스가 하나도 없는 객체
▶ 더 이상 접근하여 사용할 수 없게 되었음
28) 가비지 켈렉션
▶ 자바 가상 기계의 가비지 컬렉터가 자동으로 가비지를 수집하여 반환
▶ 자바에서 가비지 자동 회수
▶ 가용 메모리 공간으로 확보
▶ 가비지 컬렉터(garbage collector)에 의해 자동 수행
29)개발자에 의한 강제 가비지 컬렉션
▶ System 또는 Runtime 객체의 gc() 메소드 호출
▶ 이 코드는 자바 가상 기계에 강력한 가비지 컬렉션 요청
▶ 그러나 자바 가상 기계가 가비지 컬렉션 시점을 전적으로 판단
▶ System.gc(); // 가비지 컬렉션 작동 요청
30) 접근지정자
▶ 디폴트(default) 멤버
- 같은 패키지 내의 다른 클래스만 접근 가능
▶ public 멤버
- 패키지에 관계 없이 모든 클래스에서 접근 가능
▶ private 멤버
- 클래스 내에서만 접근 가능
- 상속 받은 하위 클래스에서도 접근 불가
▶ protected 멤버
- 같은 패키지 내의 다른 모든 클래스에서 접근 가능
- 상속 받은 하위 클래스는 다른 패키지에 있어도 접근 가능
31) non-static 멤버의 특성
▶ 인스턴스 멤버라고도 부름
▶ 공간적 - 멤버들은 객체마다 독립적으로 별도 존재
▶ 시간적 - 필드와 메소드는 객체 생성 후 비로소 사용 가능
▶ 비공유의 특성 - 멤버들은 여러 객체에 의해 공유되지 않고 배타적
32) static 멤버의 특성
▶ 클래스 멤버라고도 부름
▶ 공간적 특성 - 클래스 당 하나만 생성.
▶ 시간적 특성 - 클래스가 로딩될 때 공간 할당
- 자바가상기계(JVM)가 시작되는 시점
▶ 공유의 특성 - 동일한 클래스의 모든 객체에 의해 공유
33) 전역 변수와 전역 함수를 만들 때 활용
▶ 자바의 캡슐화 원칙 지킴
▶ 다른 클래스에서 공유하는 전역 변수나 전역 함수도 반드시 클래스 내부에 구현해야 함
34) static 멤버를 가진 클래스 사례
▶ java.lang.Math 클래스
▶ JDK와 함께 배포되는 java.lang.Math 클래스
▶ 모든 필드와 메소드가 public static으로 선언
▶ 다른 모든 클래스에서 사용할 수 있음
[1] 잘못된 방법
- Math m = new Math(); // Math() 생성자는 private
- int n = m.abs(-5);
[2] 바른 사용법
- int n = Math.abs(-5);
35) static 메소드의 제약 조건
▶ static 메소드는 오직 static 멤버만 접근 가능
▶ 객체가 생성되지 않은 상황에서도 static 메소드는 실행될 수 있기 때문에, non-static 메소드와 필드 사용 불가
▶ non-static 메소드는 static 멤버 사용 가능
▶ static 메소드는 this 사용불가
▶ static 메소드에 객체필드 및 일반메소드 사용불가
36) final
▶ 상수 필드는 선언 시에 초기 값을 지정하여야 한다
▶ 상수 필드는 실행 중에 값을 변경할 수 없다
▶ final 클래스 - 더 이상 클래스 상속 불가능
▶ final 메소드 - 더 이상 오버라이딩 불가능
▶ final 필드 - 더 이상 변경 불가, 상수
class SharedClass {
public static final double PI = 3.141592653589793;
}
public class FinalFieldClass {
final int ROWS = 10; // 상수 정의, 이때 초기 값(10)을 반드시 설정
void f() {
int [] intArray = new int [ROWS]; // 상수 활용
ROWS = 30; / / 컴파일 오류 발생, final 필드 값을 변경할 수 없다.
}
}
----------------- Static 멤버를 객체의 멤버로 접근 -------------------
---------------- Static 멤버를 클래스 이름으로 접근 -----------------
'Programming Language > JAVA' 카테고리의 다른 글
상속, 패키지, 제네릭컬렉션 (0) | 2018.07.14 |
---|---|
test (0) | 2018.07.14 |
댓글