명품 자바 프로그래밍 4장
4.1 객체 지향과 자바
*객체(object)란?
자신만의 고유한 특성(state)과 행동(behavior)을 가지는 모든 것.
객체지향의 특성
- 캡슐화(Encapsulation)
객체의 내부를 보호. class 라는 캡슐을 사용하며 필드(멤버 변수)와 메소드(멤버 함수)로 구성
- 상속(Inheritance)
자바의 상속은 자식 클래스가 부모 클래스의 속성을 물려받고 기능을 추가하여 확장(expends)하는 개념.
- 부모 클래스: 슈퍼 클래스(super class)
- 자식 클래스: 서브 클래스(sub class)
- 다형성(Polymorphism)
같은 이름의 메소드가 클래스 혹은 객체에 따라 다르게 동작하도록 구현하는 것.
- 메소드 오버라이딩(overriding): super class에서 구현된 메소드를 sub class에서 동일한 이름으로 자신의 특징에 맞게 다시 구현하는 것.
- 메소드 오버로딩(overloding): 클래스 내에서 이름이 같지만 서로 다르게 동작하는 메소드를 여러 개 만드는 것.
객체 지향 언어의 목적
절차지향(Structured Procedural Programming language)의 단점을 보완한 객체지향(Object Oriented Language)
- 소프트웨어의 생산성 향상
- 실세계에 대한 쉬운 모델링
4.2 자바 클래스 만들기
클래스(class)
- 객체(instance)를 만들어내기 위한 설계도 혹은 틀
- 붕어빵 틀은 class, 붕어빵은 instance
public class Circle{//접근권한 클래스선언 클래스이름
//필드
public int radius;//원의 반지름 필드
public String name;//원의 이름 필드
//메소드
public Circle(){//원의 생성자 메소드
}
public double getArea(){//원의 면적 계산 메소드
return 3.14*radius*radius;
}
}
- 이 코드는 이름이 Circle인 클래스를 선언.
- 객체 내에 값을 저장할 멤버 변수를 필드라고 부름. 여기서는 radius와 name 두 필드.
- public은 접근지정자.
- 클래스의 이름과 동일한 메소드를 생성자(constructor). 객체가 생성될 때 자동으로 호출되는 특별한 메소드
Circle 클래스와 객체 생성하고 활용
public static void main(String[]args){
Circle pizza;//Circle 객체에 대한 레퍼런스 변수 pizza 선언
pizza=new Circle;//Circle 객체 생성
pizza.radius=10;//radius 필드에 10 저장
pizza.name="자바피자";//name 필드에 "자바피자" 저장
double area=pizza.getArea();//pizza 객체의 면적 알아내기
}
- 레퍼런스 변수 선언
변수 pizza는 Circle 클래스의 객체에 대한 주소(정확히 말해 레퍼런스)를 가지는 변수(*객체는 아님*).
- 객체 생성, new 연산자
Circle 객체의 주소(레퍼런스)르류pizza 변수에 대입.
- Circle 타입 크기의 메모리 할당
- Circle() 생성자(constructor)코드 실행
- 객체 멤버 접근
객체 멤버에 접근할 때는 레퍼런스 변수 뒤에 점(.) 연산자를 붙임.
4.3 생성자(constructor)
객체가 생성될 때 객체의 초기화를 위해 샐힝되는 메소드
public class Circle{//접근권한 클래스선언 클래스이름
//필드
public int radius;//원의 반지름 필드
public String name;//원의 이름 필드
//메소드
public Circle(){//매개 변수 없는 생성자
radius=1; name="";//필드 초기화
}
public Circle(int r, String n){
radius=r; name=n;//argument로 필드 초기화
}
public double getArea(){//원의 면적 계산 메소드
return 3.14*radius*radius;
}
}
- 생성자의 이름은 클래스 이름과 동일
- 생성자는 여러 개 작성(오버로딩)할 수 있다.
- 생성자는 new를 통해 객체를 생성할 때 한 번만 호출된다.
- 생성자에 리턴 타입 지정할 수 없다.
- 생성자의 목적은 객체가 생성될 때, 필요한 초기 작업을 위함이다.
- 생성자가 없는 클래스는 있을 수 없다.
기본 생성자(default constructor)
매개변수와 실행코드가 없어 아무 일도 하지 않고 단순 리턴하는 생성자.
class Circle{
public Circle(){}//기본생성자. 매개변수 없고 단순 리턴
}
this 레퍼런스
객체 자신을 가리키는 레퍼런스
*this 기초 개념
- 객체 자신에 대한 레퍼런스. 즉 현재 실행되고 있는 메소드가 속한 객체에 대한 레퍼런스.
public class Circle{
int radius;
public Circle(int r){this.radius=r;}
public int getRadius(){return radius;}
}
this는 현재 객체에 대한 레퍼런스이므로, this.radius는 현재 객체의 멤버 radius에 접근
*this의 필요성
public Circle(int radius){ this.radius/*멤버 radius*/=radius/*매개변수 radius*/;}
*this()
클래스 내에서 생성자가 다른 생성자 호출할 때 사용하는 자바 코드.
public class Book{
String title;
String author;
void show(){System.out.println(title+" "+author);
public Book(){
this("","");
System.out.println("생성자 호출됨");
}
public Book(String title){
this(title,"작자미상");
}
public Book(String title, String author){
this.title=title;
this.author=author;
}
}
주의할 점
- this()는 반드시 생성자 코드에서만 호출 가능
- this()는 반드시 같은 클래스 내 다른 생성자를 호출할 때 사용
- this()는 반드시 생성자의 첫 번째 문장이 되어야 함.
4.4 객체 배열
객체에 대한 레퍼런스를 원소로 갖는 배열.
Circle[] c;//Circle배열에 대한 레퍼런스 변수 c 선언
c=new circle[5];//레퍼런스 배열 생성
for(int i=0;i<c.length;i++)//c.length는 배열 c의 크기로서 5
c[i]=new Circle(i);//배열의 각 원소 객체 생성
4.5 메소드 활용
메소드는 클래스의 멤버 함수.
메소드 오버로딩(method overloading)
한 클래스 내에 이름이 같지만 매개변수 타입이나 개수가 서로 다른 여러 개의 메소드를 중복 작성 하는 것.
- 메소드 이름이 동일해야 함
- 매개변수의 개수나 타입이 서로 달라야 함.
*성공 사례
class MethodOverloading{
public int getSum(int i, int j){
return i+j;
}
public int getSum(int i, int j, int k){
return i+j+k;
}
}
*실패 사례
class MethodOverloading{
public int getSum(int i, int j){
return i+j;
}
public double getSum(int i, int j){
return (double)i+j;
}
}
4.6 객체의 소멸과 가비지 컬렉션
객체 소멸
new에 의해 생성도니 객체 공간을 자바 가상 기계에 돌려줘 가용 메모리(available memory)에 포함시키는 것.
- C++에서는 delete 연산자
- Java에서는 유사하게 finalize()있지만 delete 연산자, 소멸자 다 없음. ->자바 장점
가비지 컬렉션
더이상 참조되지 않는 가비지를 회수해 가용 메모리 늘리는 것.
*가비지 컬렉션 강제 요청
System.gc();
4.7 접근 지정자
패키지(package)
자바는 서로 관련 있는 클래스 파일들을 패키지(package)에 저장해서 관리.
디렉토리, 폴더와 같은 개념.
자바의 4가지 접근 지정자(access specifier)
자바에는 private, proteced, public, 접근 지정자 생략(디폴트 접근 지정)의 4 가지 접근자가 있음.
*클래스 접근 지정
다른 클래스에서 이 클래스 활용할 수 있는지 허용 여부를 지정하는 것.
- public 클래스
패키지 상관 없이 다른 어떤 클래스에게도 사용이 허용됨.
public class World{
...
}
- 디폴트 클래스(접근 지정자 생략)
같은 패키지 내의 클래스들에게만 사용이 허용 됨.
class Local{
...
}
*멤버 접근 지정
pivate<default<protected<public 순으로 공개 범위 넓어짐.
멤버에 접근하는 클래스 | 멤버의 접근 지정자 | |||
private | default | protected | public | |
같은 패키지의 클래스 | x | o | o | o |
다른 패키지의 클래스 | x | x | x | o |
접근 가능 영역 | 클래스 내 | 동일 패키지 내 | 동일 패키지와 자식 클래스 | 모든 클래스 |
- public 멤버
패키지 막론하고 모든 클래스들이 접근 가능.
- private 멤버
비공개를 지시. 클래스 내의 멤버들에게만 접근이 허용됨.
- protected 멤버
보호된 공개를 지시.
1. 같은 패키지의 모든 클래스에 접근 허용
2. 다른 패키지에 있더라도 자식 클래스의 경우 접근이 허용
- 디폴트 멤버(default 또는 package-private)
접근 지정자 생략된 멤버.
동일한 패키지 내에 있는 클래스들만 디폴트 멤버를 자유롭게 접근 가능.
4.8 static 멤버
눈은 각 사람마다 있고 공기는 모든 사람이 소유(공유)함
- 여기에서 눈은 사람이라는 객체의 non-static 멤버, 공기는 static 멤버
- 공기는 오직 하나만 있고 모든 사람이 공유함.
non-static 멤버 | static 멤버 | |
선언 | class Sample{ int n; void g(){...} } |
class Sample{ static int m; static void g(){...} } |
공간적 특성 | 멤버는 객체마다 별도 존재 - 인스턴스 멤버라고 부름 |
멤버는 클래스당 하나 생성 - 멤버는 객체 내부가 아닌 별도의 공간(클래스 코드가 적재되는 메모리)에 생성 - 클래스 멤버라고 부름 |
시간적 특성 | 객체 생성 시 멤버 생성됨 - 객체가 생길 때 멤버도 생성 - 객체 생성 후 멤버 사용 가능 - 객체가 사라지면 멤버도 사라짐 |
클래스 로딩 시에 멤버 생성 - 객체가 생기기 전에 이미 생성 - 객체가 생기기 전에도 사용 가능 - 객체가 사라져도 멤버는 사라지지 않음 - 멤버는 프로그램이 종료될 때 사라짐. |
공유의 특성 | 공유되지 않음 - 멤버는 객체 내의 각각 공간 유지 |
동일한 클래스의 모든 객체들에 의해 공유됨. |
static의 활용
- 전역변수와 전역함수 만들 때 활용
Java에서는 C++과 달리 어떤 변수나 함수도 클래스 바깥에 존재할 수 없으며 클래스 멤버로 존재해야 함(캡슐화).
모든 클래스에서 공유하는 전역변수나 모든 클래스에서 호출가능한 전역함수 필요한 경우 static 사용.
static 제약조건
- static 메소드는 static 멤버만 접근 가능
- static 메소드는 this 사용 불가능.-객체 없이도 존재하기 때문에.
4.9 final
- final 클래스
클래스를 상속받을 수 없음을 지정.
- final 메소드
오버라이딩 할 수 없는 메소드임을 선언.
- final 필드
필드는 상수가 됨.
상수 필드는 한 번 초기화되면 값을 변경할 수 없음.
'Language > Java' 카테고리의 다른 글
[명품 Java Programming]5장 문제 (0) | 2020.07.15 |
---|---|
[명품 Java Programming]4장 연습문제 (0) | 2020.07.11 |
[명품 Java Programming]3장 연습문제 (0) | 2020.07.11 |
[명품 Java Programming]3장 반복문과 배열 그리고 예외 처리 (0) | 2020.07.11 |
[명품 JAVA Programming]2장 연습문제 (0) | 2020.07.08 |
댓글