* 패키지와 접근제한자
- 패키지 : 물리적인 형태는 파일 시스템 폴더
- 클래스의 일부분으로 클래스를 유일하게 만들어주는 식별자 역할
- 클래스 이름이 동일하더라도 패키지가 다르면 다른 클래스로 인식
- 클래스의 전체 이름은 (패키지 + 클래스) 사용해서 표현한다
=> 상위패키지.하위패키지.클래스 : ex) com.mycompany.a
1.패키지 선언 : 클래스 작성 시 해당 클래스가 어떤 패키지에 속할 것인지를 선언
- ex) package 상위패키지.하위패키지; => java 로 시작하는건 자바 표준 API만 사용하므로 사용불가 2.import문
- 사용하고자 하는 클래스 또는 인터페이스가 다른 패키지에 소속된 경우 사용
- 해당 패키지 클래스 또는 인터페이스 가져와 사용할 것임을 컴파일러에 통지
- 패키지 선언과 클래스 선언 사이에 작성한다
- 하위 패키지는 별도로 import 해야한다
- 다른 패키지에 동일한 이름의 클래스가 있을 경우 import와 상관없이 클래스 전체 이름을 기술
- 접근 제한자(access modifier) : 클래스와 인터페이스 및 이들이 가진 멤버의 접근 제한
1.public 접근 제한자 : 외부 클래스가 자유롭게 사용할 수 있도록 한다 2.protected 접근 제한자 : 같은 패키지 또는 자식 클래스에서 사용할 수 있도록 한다 3.private 접근 제한자 : 외부에서 사용할 수 없도록 한다 4.default 접근 제한 : 가튼 패키지에 소속된 클래스에서만 사용할 수 있도록 한다 ** class 에서는 default, public 만 접근 제한자 사용 가능 하다
- ex1)
package guro; // class 에서는 default, public 만 접근 제한자 사용 가능 하다 // default(package) 접근 제한자 : 한 패키지 내에서만 접근 가능 => 보안 // 무표기 // class Test1 { //default public class Test1 { // 모든 패키지에서 사용 가능( 가장 개방적) // private class Test1 { // (X) // protected class Test1 { // (X) }
* ex2) & ex3) : 같은 패키지에 속한 경우 의 예
- ex2)
package guro; // class 에서는 default, public 만 접근 제한자 사용 가능 하다 // default(package) 접근 제한자 : 한 패키지 내에서만 접근 가능 => 보안 // 무표기 // class Test1 { //default // 같은 패키지 내에서는 사용이 가능하다 ex) Test3 public class Test1 { // 모든 패키지에서 사용 가능( 가장 개방적) // private class Test1 { // (X) // protected class Test1 { // (X) // 같은 클래스 내에서만 접근 가능 // private String name; // String name; // default // protected : 같은 패키지 내에서 접근 가능 // 다른 패키지일 경우에 상속일 경우에"만" 접근 가능 //protected String name; // public : 가장 개방적, 모든 패키지에서 접근 가능 public String name; }
- ex3)
package guro; public class Test3 { Test1 test1; // name : private => 같은 클래스 내에서만 접근 가능하므로 외부에서는 사용이 불가능 // name : (default/package) // => 같은 클래스 내에서만 접근 가능 하여 사용 가능 // protected : 같은 패키지 내에서 접근 가능 // 다른 패키지일 경우에 상속일 경우에"만" 접근 가능 // public : 가장 개방적, 모든 패키지에서 접근 가능 String name = new Test1().name; }
* ex2) & ex4) : 다른 패키지에 속한 경우 의 예
- ex2)
package guro; // class 에서는 default, public 만 접근 제한자 사용 가능 하다 // default(package) 접근 제한자 : 한 패키지 내에서만 접근 가능 => 보안 // 무표기 // class Test1 { //default // 같은 패키지 내에서는 사용이 가능하다 ex) Test3 public class Test1 { // 모든 패키지에서 사용 가능( 가장 개방적) // private class Test1 { // (X) // protected class Test1 { // (X) // 같은 클래스 내에서만 접근 가능 // private String name; // String name; // default // protected : 같은 패키지 내에서 접근 가능 // 다른 패키지일 경우에 상속일 경우에"만" 접근 가능 protected String name; // public : 가장 개방적, 모든 패키지에서 접근 가능 // public String name; }
- ex4)
package kasan; // 접근 가시성(access visibility) : 접근 제한자로 조정 // 캡슐화(encapsulation) : 보안 import guro.Test1; public class Test2 extends Test1{ // extends => 상속 Test1 test1; // String name = new Test1().name; // protected 의 경우 (X) // String name = super.name; // protected 의 경우 (O) //String name1 = name; // 문맥상 super.name과 동일한 의미 이다 String name1 = super.name; // 위(name1)와 같은 의미이다. // protected : 상속 관계가 있을 경우 다른 패키지에서 접근 가능 하다 // 참고) this : 자기 자신의 객체 키워드 // this() : 자기 자신의(기본) 생성자 // super : 부모 클래스의 객체 키워드 // super() : 부모 클래스의 (기본) 생성자 }
** 생성자 접근 제한테 따라 생성자 호출 가능 여부 결정
- Getter 와 Setter 메소드
1.Getter 메소드 : 외부로 필드값을 “전달”하는 것이 목적이다,필드값을 가공해서 외부로 전달할 수도 있다
2.Setter 메소드 : 외부읙 ㅏㅄ을 받아 필드의 값을 “변경” 하는 것이 목적이다, 매개값 검증하여 유효간 값만 필드로 저장할 수 있다.
* persistent repository(영속/영구 저장소) : DB
-
회원 가입 -> DTO(TO) : 유효성 점검 -> Controller -> Service(VO(entity) -> DAO(DML:CRUD)) -> DB
-
ex) 전화번호(휴대폰) ```java 저장할 내용 : 010-1234-56758
DTO : phone1,phone2,phone3
VO : phone
DB : 010-1234-5678 ```
* 상속
-
상속 : 이미 개발된 클래스를 재사용하여 새로운 클래스를 만든다 => 중복되는 코드를 줄인다
- 클래스 상속 : 자식 클래스 선언시 부모 클래스 선택 => extends 뒤에 부모클래스 기술
- 여러 개의 부모클래스 상속할 수 없다
- 부모 클래스에서 private 접근 제한 갖는 필드와 메소드는 상속 대상에서 제외 된다
- 부모와 자식 클래스가 다른 패키지에 존재할 경우 default 접근 제한된 필드와 메소드 역시 제외 된다
- 자식 생성자의 맨 첫줄에서 부모 생성자가 호출 된다
* 메소드 재정의(오버라이딩/Overriding)
- 메소드 재정의 : 부모클래스의 메소드가 자식 클래스에서 사용하기에 부적합할 경우 자식 클래스에서 수정하여 사용한다
- 부모 메소드와 동일한 시그니처를 가져야 한다
- 재정의 될 경우 부모 객체 메소드가 숨겨지며 자식 객체에서 메소드 호출하면 재정의된 자식 메소드가 호출 된다
** 오버라이딩의 조건
1) 상속(클래스)/구현(인터페이스)을 전제로 한다.
2) 메서드 이름이 같아야 한다.
3) 인자부가 같아야 한다.
4) 리턴형이 같아야 한다.
5) 접근 제어자가 부모 클래스(인터페이스) 보다 축소되어서는 안된다.
ex) 상속 = 단순한 계승이 아닌 확장(extends)으로 간주 => "접근 제어자" 축소(X)
6) 부모(조상) 클래스 보다 더 넓은(포괄적인, 상위의) 예외클래스를 가질 수 없다.
7) 부모 클래스 메서드와 다른 계층의 예외처리를 가질 수 없다.
ex) IOException, SQLException은 Exception의 자녀 클래스이지만 서로 다른 계층
8) final 키워드가 지정되면 오버라이딩할 수 없다.
9) static 메서드는 오버라이딩 할 수 없다.
10) private 메서드도 상속 자체가 안되기 때문에 오버라이딩 할 수 없다.
* 타입 변환과 다형성
- 다형성 : 사용 방법은 동일하지만 다양한 객체를 활용해 여러 실행 결과가 나오도록 하는 성질,메소드 재정의와 타입 변환으로 구현된다
- 자동 타입 변환(promotion) : 프로그램 실행 도중 자동으로 타입 변환이 일어나는 것
- 필드의 다형성 : 필드 타입을 부모 타입으로 선언할 경우 : 다양한 자식 객체가 저장되어 필드 사용 겨로가가 달라질 수 있다
- 매개 변수의 다형성 : 매개 변수를 부모 타입으로 선언하는 효과
- 강제 타입 변환(casting) : 부모 타입을 자식 타입으로 변환
- instanceof 연산자 : 어떤객체가 어느 클래스의 인스턴스인지 확인