2021. 1. 23. 14:57ㆍDev.Program/Java & Spring
p.212~ 간단 설명
======== Ex7.java 만들기 (package 설명)
p.236
< package(패키지) >
- 윈도우에서의 폴더, 리눅스에서의 디렉토리에 해당하는 개념
- 자바의 클래스 파일들을 모아놓은 공간
- ⇒ 서로 다른 패키지에는 같은 이름의 클래스가 각각 존재할 수 있다!
- (같은 이름의 파일이 서로 다른 폴더에 존재하는 것과 동일)
- 자바에서 패키지를 사용하면, 실제 폴더가 패키지로 구분됨
- 특정 클래스 파일은 하나의 패키지에'만' 소속되어야 함
< package 키워드 >
- 특정 클래스 파일의 맨 첫 번째 라인에 해당 클래스가 소속된 패키지명을 명시
- 실제 클래스 파일이 위치하는 패키지와 다를 경우 오류 발생
- 소스 코드의 첫번째 라인(주석 제외)에서만 사용 가능한 키워드
- ⇒ 클래스 내에서 단 한 번만 사용 가능
< package 키워드 사용 기본 문법 >
-------- 소스코드 첫 번째 라인에서 --------
package 패키지명;
< import 키워드 >
- 원래 클래스에 접근할 때 패키지명.클래스명 형태로 특정 클래스에 접근하거나 import 문을 사용하여 특정 패키지의 위치를 선언하여 패키지명 지정 생략 가능
- (같은 패키지 내에서는 패키지명을 생략할 수 있다)
- java.lang 패키지는 유일하게 생략이 가능한 패키지
- ⇒ 그 외의 모든 패키지는 반드시 위치 정보가 필요함
- import 문 뒤에 패키지명과 클래스명을 지정하면 특정 클래스만 포함시키고, 패키지명 뒤에 만능문자(*)를 지정하면 해당 패키지 내의 모든 클래스를 포함
- package 문보다 아래쪽, 다른 코드들보다 윗쪽에 명시해야하며 package 문은 단 한 번만 사용 가능하지만, import 문은 여러번 사용 가능
- 자동 import 단축키 : Ctrl + Shift + O
< import 키워드 사용 기본 문법 >
import 패키지명.클래스명;
또는
import 패키지명.*;
- 자바에서 기본으로 제공하는 rt.jar
- 우리가 지금까지 쓴 String 은 여기서 가져오는거
- java.lang.String s = "유라"; 원래 정석대로 쓰려면 이렇게 써야함!
- 그러나 java.lang 은 유일하게 패키지명이 생략 가능하다. (가장 자주 쓰이므로)
- 밑에 util 패키지는 생략하면 오류남
- package test; 라고 쓰면 Ex7 클래스는 test 패키지에 소속되어 있지 않으므로 컴파일 에러가 발생한다.
< Ex7.java > → 전체 코드
// package test;
// ⇒ Ex7 클래스는 test 패키지에 소속되어 있지 않으므로 컴파일 에러 발생!
// 현재 위치는 Default package 이므로 아무런 package 도 지정하지 않아야함
import java.util.Date;
// java.util 패키지의 Date 클래스를 현재 소스코드에 포함시킴
// ⇒ 이 코드가 있을 때는 Date 클래스명 앞에 패키지명을 생략할 수 있다!
import javax.swing.JButton;
import javax.swing.JFrame; // 자동완성 하면 자동으로 import 구문 추가됨.
// ⇒ 각각 서로 다른 클래스들을 별도로 지정하는 경우에 사용하는 문장
//import javax.swing.*;
// ⇒ 특정 패키지 내의 모든 클래스들을 한꺼번에 import 시키는 문장
// ⇒ javax.swing 패키지의 클래스만 포함하고,
// 서브패키지(폴더)는 포함시키지 않는다!
public class Ex7 {
public static void main(String[] args) {
// java.lang 패키지에 있는 String 클래스를 사용할 경우
java.lang.String s = "홍길동";
String s2 = "홍길동2"; // java.lang 패키지라 패키지명 생략 가능
// java.util 패키지에 있는 Random 클래스의 참조변수 선언
java.util.Random rr;
// java.util 패키지에 있는 Random 클래스의 인스턴스 생성
java.util.Random r = new java.util.Random();
// Random r2 = new Random();
// ⇒ 패키지명을 지정하지 않으면 컴파일 에러 발생!
// java.util 패키지에 있는 Date 클래스의 인스턴스 생성
Date d = new Date();
// ⇒ 패키지명이 없지만,
// import 문을 통해 Date 클래스를 포함시켰으므로 오류 X
// javax.swing 패키지에 있는 JFrame 클래스의 인스턴스 생성
// javax.swing.JFrame f;
JFrame f;
// javax.swing 패키지에 있는 JButton 클래스의 인스턴스 생성
JButton btn = new JButton();
}
}
- new - package 만들기 (Name : test)
- package 만들어짐.
- test 위에서 new - class 만드니까 이렇게 패키지네임 알려줌! Ex.java 이름으로 class 생성
- 자동으로 package test; 가 생성 된 모습을 볼 수 있다.
- 여기선 test 패키지 안 이므로 오류 안남.
- window - Preferences.
- Java - Code Style - Organize Imports
- 설정 바꾸는 창이 뜬다!
- 아랫부분에 99 로 된 걸 1로 바꿔본다 (99단계까지 보여준다는 뜻)
- 1로 바꾸고 자동완성하면 import javax.swing.*; 이렇게 뜸!
- 우리는 공부중이기때문에 (아직 어디에 뭐가 있는지 모르니까) 99로 다시 바꿔줌
- 우리는 처음에 패키지를 안 만들고 시작했는데 그럼 자동으로 Default package에 저장됨.
- Default package는 작업관리자로 가서 보면 이렇게 src 에 그냥 저장됨.
- 만들어진 test 패키지는 폴더가 하나 생성 된 걸 볼 수 있음.
(지금 우리는 연습중이라 상관 없지만 실무에서는 관리가 힘들다 → package 별로 폴더를 구분해놓으면 직관적으로 보이고 관리하기가 쉬움.)
tip. 패키지명을 만들땐 회사의 도메인네임을 사용(전세계에서 중복이 불가)
- p.236 -237 참고
- src 에서 new - class 만들면 패키지명 부터 내가 설정 가능
- 이렇게 패키지부터 class 까지 자동 생성됨
- 패키지명에서 F2 누르면 패키지이름 변경가능
- 이렇게 한 번 만들어보고 (이렇게 만드는 건 나쁜 예!)
- 이렇게 한 번 만들어보기 (좋은 예) ⇒ 만들어진 파일 보면 알수있음.
- 만들어진 파일 보면 두 가지 방법이 차이가 난다! 책 p236-237
- 2번째 방법으로 만든 건 tv로 묶여서 구분 된 것을 볼 수 있다. (좋은 예)
======== Ex8.java 만들기 : 기본형과 참조형
p.195-197
< 기본형 변수와 참조형 변수의 차이 >
- 기본형(Primitive Type) 변수는 실제 값(리터럴)을 저장하며, 참조형(Reference Type) 변수는 인스턴스의 주소값(참조값)을 저장
- 변수의 값을 복사할 때
- 기본형 : 변수에 저장된 실제 값을 복사(Pass by Value)
- ⇒ 복사본과 원본은 아무런 관계가 없으므로 복사본의 값을 변경해도 원본이 변경되지 않음
- 참조형 : 변수에 저장된 인스턴스의 주소 값을 복사(Pass by Reference)
- ⇒ 복사본과 원본은 같은 주소값을 가지므로, 같은 인스턴스를 가리킴.
- ⇒ 복사본을 통해 인스턴스 값을 변경하면 원본 인스턴스의 값도 같이 변경됨(변경된 값을 같이 공유함)
1) 기본형 : 변수에 저장된 실제 값을 복사(Pass by Value)
⇒ y값은 안바뀜
→ 복사본과 원본은 아무런 관계가 없으므로 복사본의 값을 변경해도 원본이 변경되지 않음
2) 참조형 : 변수에 저장된 인스턴스의 주소 값을 복사(Pass by Reference)
⇒ d1과 d2 다 바뀜 (d2에도 영향을 미침)
→ 복사본과 원본은 같은 주소값을 가지므로, 같은 인스턴스를 가리킴. 그래서 복사본을 통해 인스턴스 값을 변경하면 원본 인스턴스의 값도 같이 변경됨
- num 값을 전달만 하고, 내 num 값에는 영향 X (기본형 예제)
- 오류 없애보기 (class 안에 메소드 만들어보기)
- refNum 이름은 중요한게 아님(다른거 설정 가능)
- 이렇게는 못넣음! 여긴 참조형이기 때문에 값이 들어갈 수 없다.
- 주소값을 줘야함.
→ num 의 주소값을 전달해줘야하기 때문에 refNum.num 으로 주소값을 불러옴(참조형 예제)
- 내 값도 바뀜! 파라미터로 참조형 변수를 전달 시, 주소값의 복사가 일어나기 때문.
- 원본에도 영향을 미친다.(참조형 예제)
'Dev.Program > Java & Spring' 카테고리의 다른 글
[Java] 메서드 오버라이딩(Overriding) (1) | 2022.10.05 |
---|---|
[Java] 상속(Inheritance) (1) | 2022.10.05 |
[Java] 생성자(Constructor) (0) | 2021.01.23 |
[Java] 오버로딩 / 가변인자 (0) | 2021.01.23 |
[Java] 변수 선언 위치에 따른 분류 / 접근제한자 (0) | 2021.01.23 |