티스토리 뷰

day11 190305


상수 관련키워드 static, final과 패키지에 대해서 배웠습니다.

static에 대해서 아직은 심도있게 다루지 않아서 용도가 애매모호하게 와닿는 것 같습니다..

그에 비해, 패키지는 현장에서에 대한 걸 배웠는데 흥미가 깊었습니다!


--static  >>> 필드/ 메소드/ 클래스에 부착

: 한번만 만들어지는 것을 의미


- 값이 변하지 않는 상수 등을 담을 때 주로 사용된다.


public class A {

int x; <<< 인스턴스 변수, 멤버변수

     static  int y; <<< 정적 변수, 클래스 변수

}

--final : 최종적이라는 의미. 수정이 불가능해진다.

final class A {~} << 상속금지

final void method() {} << 재정의금지

final int x = 10; << 값변경금지


* 상수는 대문자로 표현한다. 

(합성어일때는 _를 사용)  (상수는 공개하므로 public)  (수정 불가이므로 final)

 > 공개된 정적 상수.


public static final double DISCOUNT_RATE = 0.03;

public static final int MAX_UPLOAD_SIZE = 10485760;

public static final String FILE_UPLOAD_DIRECTORY = "c:/files";


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class StaticService {
    int x;            // 설계도 로딩 후 -> 객체 생성 후 사용가능한 필드
    static int y;    // 설계도 로딩 후 사용가능한 필드 ( 객체 생성필요x)
    final int z = 10;
 
    public void m1() {                // 인스턴스 메소드 ( 객체 생성을 해야 사용가능한 메소드)
        System.out.println("x의 값 : " + x);
        System.out.println("y의 값 : " + StaticService.y);
    }
 
    public static void m2() {        // 정적 메소드       ( 객체 생성 없이 사용가능한 메소드)
        // System.out.println("x의 값 : " + x);            정적 메소드는 따로 관리되서 static외에는 사용 불능.
        System.out.println("y의 값 : " + StaticService.y);
    }
}
cs

Static의 반응을 위한 클래스를 작성해봐서 보겠습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class StaticServiceApp {
    public static void main(String[] args) {
        
        // 정적필드, 정적메소드는 객체 생성없이 즉시 사용가능하다.
        // 클래스이름.필드명
        // 클래스이름.메소드명()
        StaticService.y = 10;                    // 정적필드 사용하기
        StaticService.m2();                        // 정적메소드 사용하기
        System.out.println(StaticService.y);
        // System.out.println(StaticService.x);       << 오류를 보면 static이 아니라서 사용불가능 하다고 나옴.
 
        //StaticService.z = 20;        // final 변수 z에는 새로운 값을 할당할 수 없다. 컴파일오류
    }
}
cs

4~6행에서 보이듯, 정적필드나 메소드는 따로 생성없이 사용이 가능하다.

9행은 정적메소드로 생성없이 가능하지만, 10행은 정적메소드가 아니므로 생성이 없어서 오류가 발생하게 된다.

12행은 final로 10으로 초기화 되어있어서, 다른 곳에서 절대 수정할 수가 없으므로 오류가 발생하게 된다.


( static은 당장은 살짝 겉핥기로 가르쳐주신 것 같습니다. final은 필수적으로 쓰이게될 것으로 설명을 해주셨구요.)



<패키지>

: 클래스를 체계적으로 관리하기 위해서 사용.

 * 패키지명은 동일하지 않아야 한다.


   => 회사의 도메인명을 뒤집어서 하나밖에 없는 패키지명 사용 관례.

  ex) daum.net회사일 경우  패키지명 : net.daum.io

  ex) 중앙hta 회사일 경우 kr.co.jhta.mobile // kr.co.jhta.web


* 저번 시간에 얘기했듯이, 실제로 프로그래밍을 할때 여러 클래스 파일들을 연결시켜서 작업한다고 배웠습니다.

  많을 때는 수 천가지가 될 수도 있습니다. 때문에, 그 많은 것들을 효율적으로 관리하기 위해 패키지(package)를 사용하게됩니다.

  

Student, Professor, StudentApp라는 세 가지의 파일을 예로 들어보겠습니다.

먼저 위에 법칙처럼 통상적으로 만드는 프로그램의 회사 도메인명을 따서 (예를 들어 jhta.co.kr) 거꾸로 kr.co.jhta로 사용해보겠습니다.



사용전에!

처음부터 봐오셔서 editplus를 사용하시는 분들에게 하나 알려드리고 가겠습니다.

패키지 컴파일을 할 때, 2장에서(https://alldeveloper.tistory.com/5) 한것처럼 컴파일, 실행처럼 단축키를 하나 더 만들어야합니다.

editplus에서 도구-사용자도구-추가-프로그램으로 들어가셔서

이름 : 패키지 컴파일 // 명령 : C:\Program Files\Java\jdk1.8.0_201\bin\javac.exe // 인수 : -d . $(FileName) // 디렉토리 : 파일디렉토리 // 동작 : 출력내용캡쳐로 설정해줍니다.

인수부분이 독특한데, 2장에서와 마찬가지로 이클립스에선 다룰 필요도 없으니 그냥 복붙해주셔도 무방하겠습니다.




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package kr.co.jhta.vo;        // 패키지 선언.  kr.co.jhta.vo폴더에 패키지로 시킨다.
 
public class Student {
    private int no;
    private String name;
 
    public Student() {}
    public int getNo() {
        return no;
    }
    public String getName() {
        return name;
    }
    public void setNo(int no) {
        this.no = no;
    }
    public void setName(String name) {
        this.name = name;
    }
}
cs

먼저, Student파일입니다. 1행을 보시면 패키지를 선언하는 소스가 있습니다.  jhta.co.kr의 프로그램을 만드는 것으로,

package 경로; 문법에맞춰서 회사도메인을 거꾸로하고 vo라는 폴더에 한다고하면,  package kr.co.jhta.vo; 이렇게 되겠습니다.

클래스 코딩 후, 저장은 아무데나 하셔도 되지만, 컴파일은 위에서 만든 단축키로 해주겠습니다. 

( 이 단축키로 컴파일을 하시면, 패키지 경로에 맞춰서 .class로된 파일이 들어가게됩니다.)

위 순서대로 하면, 저장했던 경로에서 kr이라는 폴더가 자동으로 생성되고 그안에 co 그안에 jhta 그안에 vo 안에 Student.class가 저장되어있습니다. 


1
2
3
4
5
6
7
8
9
10
11
12
13
package kr.co.jhta.vo;
 
public class Professor {
    private String name;
 
    public Professor() {}
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}
cs

Professor파일 역시, 같은 경로로 패키지 선언하겠습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package kr.co.jhta.app;                // 패키지 선언
 
// import kr.co.jhta.vo.*;            << 명시된 vo패키지안에 있는 모든 클래스를 불러온다.
// import kr.*;                        << kr패키지에 있는 모든 클래스를 불러온다는 의미로, kr에 있는 클래스만 불러오고, 하위패키지는 불러오지 않는다.
import kr.co.jhta.vo.Professor;
import kr.co.jhta.vo.Student;        // 다른 패키지에 있는 클래스는 import구문으로 
                                    // 해당 클래스의 전체경로(패키지경로 + 클래스명)를 명시해야한다.
public class StudentApp {
    public static void main(String[] args) {
        Student s1 = new Student();
        s1.setNo(20);
        s1.setName("홍길동");
        
        System.out.println("번호 : " + s1.getNo());
        System.out.println("이름 : " + s1.getName());
 
        Professor p = new Professor();
        p.setName("김교수");
        System.out.println("교수명 : " + p.getName());
    }
}
cs

StudentApp파일은 App종류의 파일이라서 위 두파일과는 다르게 App폴더에 저장하려고 합니다. 때문에,

1행에 package kr.co.jhta.app; 라고 선언해서 jhta파일안에 app파일에 저장하겠습니다.

5,6행은 패키지에 저장된 파일들을 부를 수 있게 출처를 적어놓는 소스입니다. import를 써서 해당경로+클래스명을 명시하면 됩니다.

(Scanner클래스 사용할 때, import java.util.Scanner; 도 마찬가지의 원리입니다.)

3행처럼 하면, vo폴더 안에있는 모든 클래스를 가져와 쓸 예정이다. 라는 말이 됩니다. 주의해야할 점은

4행처럼 하면, kr밑의 모든파일들을 불러오는 것이 아닌, kr폴더안에 있는 클래스파일들만 가져오게 됩니다.

 




(이해를 돕기위해 그림을 그려봤습니다.)


4행처럼 수행을하면 kr밑에 co, jhta, vo, app(그안의 class)파일 등을 전부 불러오는 것이 아니고, kr밑에있는 a.class와 b.class만을 불러오게 됩니다.








* 동적로딩 : import는 명시만 할뿐 실제 사용할 때 (객체 생성 시)에 

   해당 클래스를 가져와서 메모리를 할당한다.

  (이 동적로딩의 말은, 위처럼 패키지안에 다른 클래스파일을 불러서 쓸 때, import해놓은 것이 실행 시 바로 써지는 것이 아니고, 밑의 수       행문에서 사용될 때 불러와서 일시적으로 사용하게 된다는 것을 의미합니다.) 



코딩tip! : 필드는 항상 private , 클래스,생성자,메소드는 항상 public 위주

(비공개)           (공개)


패키지는 문법이 아닌듯 싶으면서도 정말 중요한 기능이므로, 확실히 숙지하는게 좋을 것 같습니다.

금일 과제가 있었는데, 마지막 메소드 문제가 상당히 까다로웠습니다. ( 나중에는 컬렉터가 알아서 해주는 기능이긴 하다더군요..)

day11.zip


과제 :

// 책 번호를 전달받아서 해당 책을 출력하는 기능

// 책정보를 전달받아서 그 책번호에 해당하는 책정보를 변경하는 기능 : 책정보를 받고 책정보들을 전부다 입력받아서 변경

// 책번호를 전달받아서 해당 책을 삭제하는 기능 : 책번호만 받고 해당책 삭제후 자리를 당겨놓기.

// 책정보를 전달받아서 출력하는 기능


제가 풀은 과제는 첨부파일안에, Book, BookService, BookService이름으로 저장해뒀습니다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
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 31
글 보관함