| 접근제어자
private 같은 클래스 내
(default) 같은 패키지 내
protected 같은 패키지 내, 다른 패키지 자손클래스 접근 가능
public 접근제한 없음, 전체
class 앞에는 public, (default)
void 등 멤버 앞에는 전부 가능
| 캡슐화
외부로부터 데이터를 보호하기 위해 접근제어자 사용
직접 접근은 막고, 메서드를 통해서 간접접근 허용
class Time {
private int hour;
private int minute;
private int second;
public void setHour(int hour) { //메서드제공
if(isNotVaildHour(hour)) return;
this.hour = hour;
}
//매개변수로 넘겨진 hour가 유효한지 확인해서 알려주는 메서드
//내부에서만 사용하는 메서드는 private으로
private boolean isNotVaildHour(int hour) {
return hour < 0 || hour > 23;
}
public int getHour() {return hour;};
}
public class TimeTest {
public static void main(String[] args) {
Time t = new Time();
t.hour = 100;
t.setHour(21);
System.our.println(t.getHour);
}
}
//접근제어자범위 최대한 좁히기
| 다형성
조상타입 참조변수로 자손타입 객체를 다루는 것
//반대의 경우는 허용안됨
Tv t = new SmartTv(); //타입 불일치에도 가능
참조변수가 조상인지 자손인지에 따라 사용가능한 멤버의 수가 달라짐
| 참조변수의 형변환
사용할 수 있는 멤버의 갯수를 조절하는 것
//기본형의 형변환: 값이 바뀜
조상, 자손 관계의 참조변수는 서로 형변환 가능
FrieEngine f = new FireEngine();
Car c = (Car)f; //자손에서 조상타입으로 멤버 줄이는 것으로 형변환 생략가능, 안전
FireEngine f2 = (FireEngine)c; //조상에서 자손으로 멤버 늘리는 것으로 형변환 생략불가
Ambulance a = (Ambulance)f; //에러
public static void main(String args[]) {
Car c = new Car();
FireEngine fe = new FireEngine(); //실제 인스턴스가 무엇인지가 중요
FireEngine fe2 = (FireEngine)c; //c가 가리키는 것을 fe2에 복사, 컴파일러는 오케이, 실제 형변환 에러
Car car2 = (Car)fe2;
car2.drive(); //결국 car2에 저장된 값이 null이라서 NullPointerException 발생
| instanceof 연산자
참조변수 형변환 가능여부 확인에 사용, 반드시 사전확인 필요
void doWork(Car c) {
if ( c instanceof FireEngine) {
FireEngine fe = (FireEngine)c;
fe.water();
else if ( c instanceof Ambulnce) { .... }
FireEngine → Car → Object
FireEngine fe = new FireEngine ();
//모두 true
System.out.println(fe instanceof Object);
System.out.println(fe instanceof Car);
System.out.println(fe instanceof FireEngine);
| 매개변수의 다형성
다형성의 장점: 다형적 매개변수, 하나의 배열로 여러종류 객체 다루기
Tv t = new SmartTv();
참조변수의 형변환: 사용가능한 멤버갯수 조절
instanceof 연산자 형변환 가능여부 확인
참조형 매개변수는 메서드 호출시, 자신과 같은 타입 또는 자손타입의 인스턴스를 넘겨줄 수 있다
class Product {
int price;
int bonusPoint;
}
class Tv extends Product { }
class Computer extends Product { }
class Audio extends Product { }
void buy(Product p) { //조상으로 자손객체들을 가리킬 수 있다
money -= p.price;
bonusPoint += p.bonusPoint;
}
Buyer b = new Buyer();
Tv tv = new Tv();
Computer com = new Computer();
b.buy(tv);
b.buy(com);
class Product {
int price;
int bonusPoint;
Product(int price) {
this.price = price;
bonusPoint = (int)(price/10.0);
}
}
class Tv1 extends Product {
Tv1() {
super(100);
}
public String toString() {return "Tv"; }
}
class Computer extends Product {
Computer() { super(200); }
public String toString() { return "Computer"; }
}
class Buyer {
int money = 1000;
int bonusPoint = 0;
void buy (Product p) {
if(money < p.price) {
System.out.println("잔액이 부족하여 물건을 살 수 없습니다.");
return;
}
money -= p.price;
bonusPoint += p.bonusPoint;
System.out.println(p + "을/를 구입하셨습니다.");
}
}
class Ex 7_8 {
public static void main(String args[]) {
Buyer b = new Buyer();
b.buy(new Tv1());
b.buy(new Computer());
System.out.println("현재 남은 돈은 " + b.money + "만원입니다.");
System.out.println("현재 보너스점수는 " + b.bonusPoint + "점입니다.");
}
}
'Java' 카테고리의 다른 글
17 [인강] 자바의정석 ch07 (0) | 2020.12.28 |
---|---|
16 [인강] 자바의정석 ch07 (0) | 2020.12.28 |
14 [인강] 자바의정석 ch07 (0) | 2020.12.22 |
13 [인강] 자바의정석 ch07 (0) | 2020.12.21 |
12 [인강] 자바의정석 ch06 (0) | 2020.12.21 |
- IT 5분 잡학사전
- 호스팅영역
- EC2
- intellij
- git연동
- AWS
- 기술블로그
- 배포
- java
- 오늘의코딩
- JIRA
- 독서후기
- filezila
- 개발도서
- 노개북
- gradle
- 웹페이지만들기
- SQLD
- LifecycleException
- 북클럽
- 정보처리기사
- 실용주의프로그래머
- ubuntu
- spring
- putty
- jdbc
- 노마드코더
- 정보처리기사 필기
- 정보처리기사 실기
- gradle build
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |