• Home
  • About
    • ming photo

      ming

      studying

    • Learn More
    • Twitter
    • Facebook
    • Instagram
    • Github
    • Steam
  • Archive
    • All Posts
    • All Tags
    • All categories
  • categories
    • HTML+CSS+JavaScript
    • JAVA
    • Algorithm
    • DB
    • JSP
    • 정보처리기사
    • Spring
    • Thymeleaf
    • 기술면접
  • Projects

JAVA-클래스-패키지,접근제한자,상속

10 Feb 2021

* 패키지와 접근제한자

- 패키지 : 물리적인 형태는 파일 시스템 폴더
- 클래스의 일부분으로 클래스를 유일하게 만들어주는 식별자 역할
- 클래스 이름이 동일하더라도 패키지가 다르면 다른 클래스로 인식
- 클래스의 전체 이름은 (패키지 + 클래스) 사용해서 표현한다 
=> 상위패키지.하위패키지.클래스 : 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 연산자 : 어떤객체가 어느 클래스의 인스턴스인지 확인


Share Tweet +1