패키지란?

 

서로 관련된 클래스, 인터페이스들의 묶음 이다.

1. 충돌발생 방지 목적

2. 클래스들을 효율적으로 관리하기 위해 사용한다.

 

패키지명 : 소문자 사용 권장(원칙)한다.

 

import java.lang.*; 컴파일 할때 자동 추가

 

 


*의 의미 : java.lang 패키지 안의 

모든 클래스를 가져오겠다.

 

import java.util.*; 이걸 쓰면 위에 사용된게 모두 포함되어서 편리는 하지만 내가 사용하지 않는 모든 클래스들이 다 import되므로 
// 좋은 코딩은 아니다.

 

 

***다형성***

 

[다형성]? 다양한 성질
자바에서 한 타입의 참조변수로 여러 타입의 객체를 참조할 수 있도록 함으로써 다형성을 프로그램적으로 구현하였다.

(조상클래스 타입의 참조변수로 자손클래스의 인스턴스를 참조할 수 있도록 하였다.)

 

다형성을 구현하는 기술 : 업캐스팅/다운캐스팅, 오버라이딩/오버로딩


- "여러 가지 형태를 가질 수 있는 능력"을 의미
각 객체에 맞춰서 코딩되는 것이 다형성이다.
예) 쉬는 시간에  사람(학생)들에게 화장실 갔다오세요(일/기능) 메서드
ㄴ 남학생(실체) - 남자화장실이용
ㄴ 여학생 - 여자화장실이용
예) 초등학교 산수 시험 시간
   각[ 도형 ]의 면적을 구하세요(일/기능) 메서드
삼각형 -  1/2*가로*세로
사각형 -  가로*세로
원     - 반지름*반지름*PI
마름모 -

- 자바에서 한 타입의 참조변수로 여러 타입의 객체를 참조할 수 있도록 함드로써 다형성을 프로그램적으로 구현하였다.

   -(조상클래스 타입의 참조변수로 자손클래스의 인스턴스를 참조할 수 있도록 하였다.)

-예) 자바의 정석 354p

 

Tv 상위클래스(조상)                CaptionTv 자식클래스라고 하다면

 

Tv t1 = new Tv();

 

Tv t1 = CaptionTv();    가능하다는 소리이다.

 

 

 

 

 


사원들 정보 출력하세요 () - dispEmpInfo()  메서드를 호출

 

 

참조변수의 형변환(**중요**)

 

참조변수의 형변환은 참조변수의 타입을 반환하는 것이지 인스턴스를 변환하는 것은 아니기 떄문에 참조변수의 형변환은 인스턴스에 아무런 영향을 미치지 않는다.

단지 참조 변수의 형변환을 통해서, 참조하고 있는 인스턴스에서 사용할 수 있는 멤버의 범위(개수)를 조절하는 것 뿐이다.

 

 

Employee emp2 = new Regular("홍Kill동","서울 마포구","010-2345-4568","2019-03-05",300000);

 

위의 코딩은 아래 두개의 코딩이 합쳐진것이다.

Regular r = new Regular("홍Kill동","서울 마포구","010-2345-4568","2019-03-05",300000);

Employee emp = (Employee) r ;                        //업캐스팅

                        생략가능

 

 

참고) 참조형 변환 다운캐스팅에관한 중요한 사실

 

 

추상메서드

 

abstract 기타제어자를 붙여서 선언한 몸체가 없는 불완전한 메서드를 "추상메서드" 라고한다.

 

Why 추상 메서드를 선언하고 사용하는가?

 

예를 들어 설명해 보자.

처음에는 E(getPay() 가 없었다. -->R/S/T에만 getPay() 메서드가 있었다.
emp.getPay() 호출안된다.(Employee 클래스에는 getPay()메서드가 없기 떄문이다.)


getPay함수를 Employee 클래스에서 만들때 굳이 몸체는 필요가 없다.

어차피 자식 클래스에서 오버라이딩해서 다 수정해서 재정의(오버라이딩) 하기 때문이다.


이렇게 몸체가 필요없는 메서드를 만들때 abstract 키워드를 사용하는 것이다.

 

상속받은 자식클래스에서 재정의해라(재정의 해라 ==>오버라이딩해라)라는 의도로 만드는 것이다.

Employee - getPay() 급여 계산하는 메서드 정의 안함
Regular - getPay() <- SalesMan - 재정의 getPay()
Temp - getPay()

사원마다 급여 계산하는 방법이 다 다르기 때문에 제일 상위 클래스인 Employee에서 급여 계산 메서드를 만들지 않았다.

다형성  E=R, E=S, E=T
dispEmpInfo 호출 가능

getPay  호출 불가능

추상클래스도 클래스  업캐스팅 가능하다.

 

 

 

 

캡슐화

 

[캡슐화]
99% public 클래스 제외
멤버 - 이유? 데이터 보호

 

private int kor;

외부접근 X ->따라서 접근하기 위해서 getter, setter 선언

getter만 사용했다면      수정(변경) 못하고 읽기 전용!
setter만 사용한다면   0 ~ 100  this.kor = kor     유효한 값만 설정 할수 있도록 가능

 

 

 

 

싱글톤(Singleton.java)


//  new Singleton(); 코딩에 의해 디폴트 생성자를 자동 호출한다.
//  컴파일러가 디폴트 생성자를 자동으로 추가 만약에 내가 생성자를 오버로딩한다면 컴팡일러가 디폴트 생성자를 추가하지 않으므로 
// 내가 디폴트 생성자를 선언해줘야한다.
//Singleton s1 = new Singleton(); //자동으로 디폴트 생성자 호출하는 중이다.
//-private 생성자를 선언하면 new 클래스명() 객체(인스턴스) 생성을 못하게 하겠다.
//왜? 클래스 선언해 두고 왜 객체 생성 못하게 막느냐?
//   추상클래스라면 미완성된클래스기 때문에 객체 생성을 막는 것은 이해가 됩니다.
//근데 클래스도 미완성된것도 아닌데 굳이 private를 써서 객체 생성을 맞느냐??왜!!!!!!!!!
//  ㄴ객체를 1개만 생성하겠다.는 의도이다.
//예) 반 - (반장,반장,반장,반장...)야간자율학습(30명) 조퇴
//    반 - (반장)    야간자율학습(30명) 조퇴    관리를위해 반장이라는 객체를 1개만 생성하겠다.
//코딩을 하다보면 객체를 1개만 생성해야할 경우가 있다. 이걸 싱글톤(Singleton) 이라고 한다.
// 자바 어플리케이션  -- 데이터베이스 연동 CRUD 작업을 한다. DBconn.java 싱글톤

 

 

//추상메서드가 1개도 없는 데 추상 클래스로 선언이 가능할까요? 가능하다.(선언은 가능하다)
//그럼 도데체 왜? 만드는걸까?
// ㄴ객체(인스턴스) 생성해서 사용하지 마세요. 라는 의도이다.
// ㄴ그냥 설계사의 의도이다.

 

 

싱글톤 구현방법

복사했습니다!