티스토리 뷰
1. 정리
- Top – level package 명은 고정이 되어있는데, 주로 회사 도메인을 반대로 작성하게 된다. ( com.naver )
2. 패키지
- 클래스를 만들 때, 패키지를 결정한 후에 클래스를 생성하게 된다.
- 우리의 도메인 이름 : zerock.org
- - - > org.zerock. < 앱이름 or 프로젝트 명 > . < 업무기능 별 패키지 >
- Ex. org.zerock.myapp.domain 식으로 패키지 명을 작성하게 된다.
- 패키지 명이 다르면 클래스의 이름이 같아도 충돌이 생기지는 않는디.
3. 패키지 – import 문
- 패키지 내에 같이 포함된 클래스간 클래스 이름으로 사용가능
- 패키지가 다른 클래스를 사용해야 하는 경우 :
- 1 ) 패키지 명이 포함된 전체 클래스 이름으로 사용한다.
- 2 ) import 문으로 패키지를 지정하고 사용한다.
- Ex. import com.hankook.Tire 을 작성하면 com.hanook에 tire가 선택된다.
- 컨트롤 + 쉬프트 + O를 누르면 자동으로 import가 입력된다.
- import문은 쉽게 생각하면 클래스의 출처를 알려주는 문이다.
4. 접근 제한자 ( Access Modifier )
- 클래스 및 클래스 구성 멤버에 대해 접근을 제한하는 역할을 한다.
- 1. 클래스 제한 2. 생성자 제한 3. 필드와 메소드 제한
- 접근 제한자의 종류 :
- 1 ) public ( 클래스, 필드, 생성자, 메소드 )
- : 접근할 수 없는 클래스가 없다. 가장 열려 있음.
- 2 ) protected ( 필드, 생성자, 메소드 )
- : 자식 클래스가 아닌 다른 패키지에 소속된 클레스에는 접근할 수 없다.
- : 같은 패키지 안에 있는 클래스에는 접근할 수 있다.
- : 부모자식 관계라면 다른 패키지여도 사용이 가능하다.
- : protected = default + alpha
- 3 ) default ( 클래스, 필드, 생성자, 메소드 )
- : 접근제한자로써 사용하지 않는다. Public, protected, private 중 아무 것도 사용하지 않는다면 자동으로 디폴트 값으로 들어가게 된다.
- : 다른 패키지에 소속된 클래스에 접근할 수 없다.
- : protected 와 다르게 부모 자식이더라도 접근할 수 없다.
- 4 ) private ( 필드, 생성자, 메소드 )
- : 같은 클래스 내에서만 사용이 가능하다.
- + ) Public 과 Default는 클래스, 필드, 생성자, 메소드에 적용할 수 있으나,
- + ) Protected 와 Private는 클래스를 제외한 필드, 생성자, 메소드에 적용이 가능하다.
5. 어노테이션 ( 주석 )
- 프로그램에게 추가적인 정보를 제공해주는 메타데이터
- + 메타데이터 : “77”만 작성하게 되면, 이게 속도인지 점수인지 확실하게 판단하기 힘든데, 이때 “<age>77</age>”를 붙여 77 데이터가 뭘 의미하는지 설명해주는 데이터를 의미한다.
- + 메타 데이터 = 데이터를 설명해주는 데이터, 데이터의 데이터
- 어노테이션의 용도 :
- 1 ) 컴파일러에게 코드 작성 문법 에러 체크하도록 정보 제공
- 2 ) 소프트웨어 개발 툴이 빌드나 배치 시 코드를 자동 생성하도록 정보 제공
- 3 ) 실행 시 특정 기능 실행하도록 정보 제공
- 어노테이션 타입 정의 :
- 소스파일 생성 : AnnotationName.java
- 소스파일 내용 ; public @interface AnnotationName { }
- 어노테이션 타입 적용 : @AnnotationName
- 어노테이션 값을 넣을 때, 기본속성은 value이며, 속성을 기술할 때에는 @AnnotationName(value = “값” , elementName = 3); 식으로 기술한다.
01. import 문
package org.zerock.myapp;
// java. 으로 시작하는 패키지들을 "자바표준패키지"라고 부른다. (***)
// javax. 으로 시작하는 패키지들은 "자바확장패키지"라고 부른다. (***)
import java.util.Scanner;
//import java.util.Scanner;
//import javax.accessibility.*;
// *의 의미는 all이라는 의미로 javax.accessibility에 있는 모든 클래스를 사용하겠다는 의미이다. (**)
// 하지만 *을 쓰게 되면 실행에는 지장이 없지만, 모든 클래스를 가져오기 때문에 가독성이 떨어져 노란줄로 경고를 주게 된다.
// 그렇기에 컨트롤 + 쉬프트 + O를 누르게 되면 사용하는 것만 정리해서 남게 된다.
// * : Wildcard 문자로 의미는 All이다.
public class TTT { // import 문 - 자바 컴파일러는 lang 패키지에 있는 것은 자동으로 사용하게 해준다.
public static void main ( String[] args ) {
Math.random();
Scanner scanner = new Scanner(System.in);
// - > 이렇게만 작성하게 되면 Scanner가 어디있는 파일인지 파악이 불가능해서 컴파일 오류가 뜬다.
// 그러므로 직접 import문을 작성하거나 "컨트롤 + 쉬프트 + O"를 통해 import문을 입력해야 한다**
// import문과 패키지 명도 ' ; '으로 마감을 해야 한다.
} // main
} // end class
02. 집합관계
package org.zerock.myapp.mycompany;
import org.zerock.myapp.hankook.SnowTire;
import org.zerock.myapp.hankook.Tire;
import org.zerock.myapp.hyundai.Engine;
import org.zerock.myapp.kumho.BigWidthTire;
public class Car { // 컨트롤 + 쉬프트 + O !!!
// 부품(집합) 관계의 필드 선언
Engine engine = new Engine();
SnowTire tire1 = new SnowTire();
BigWidthTire tire2 = new BigWidthTire();
Tire tire3 = new Tire(); // 클래스의 이름이 같으면 어느 패키지인지 선택하게 해준다.
// Tire tire4 = new Tire(); // 이렇게 되면 위에 import문으로 사용한 한국타이어로 선택이 되어버린다.
org.zerock.myapp.kumho.Tire tire4 = new org.zerock.myapp.kumho.Tire(); // 이럴때는 직접 위치를 작성해줘야 한다. (***)
// 이렇게 되면 복잡해지기 때문에 클래스의 명을 유니크하게 작명하는 것이 좋다.
// 예를 들어 한국 타이어나 금호 타이어와 같이
} // end class
03. 접근제한자
package org.zerock.myapp.package1;
//Mock-up class : 테스트용으로 아무것도 들어가있지 않은 클래스를 말하는 것이다.
// class 선언부에는 2가지의 접근제한자만 허용 : (1) public (2) default
class A { // < - default : 같은 패키지내에서는 얼마든지 허용
;;
} // end class
package org.zerock.myapp.package1;
//Mock-up class : 테스트용으로 아무것도 들어가있지 않은 클래스를 말하는 것이다.
public class B {
A a; // OK!! A는 default인데, A와 같은 패키지 내에 존재하기 때문에 가능하다.
} // end class
package org.zerock.myapp.package2;
import org.zerock.myapp.package1.B;
public class C {
// A a; // A는 default인데, C는 A와 다른 패키지에 존재하기 때문에 컴파일 오류가 뜬다.
// default는 같은 패키지 내에서만 보이기에 import문 사용도 불가능하다.
B b; // 가능은 하지만 import문을 사용해야 한다!!
} // end class
04. 접근제한자 2
package org.zerock.myapp.package3;
public class A {
// 우리가 배운 접근제한자(public, protected, default, private)는 같은 클래스 내부에서는 아무런 효과가 없다.
A a1 = new A (false); // ok! : 같은 클래스 내에서도 사용이 가능하다.
A a2 = new A (300); // ok!
A a3 = new A ("뭐야"); // ok! : private는 같은 클래스 내에서는 사용이 가능하다.
// 생성자 오버로딩
public A ( boolean b ) {;;} // public 접근제한을 갖는 생성자
A(int b){;;} // default 접근제한을 갖는 생성자
private A (String s) {;;} // private 접근 제한을 갖는 생성자 : 외부에서는 못 사용한다.
} // end class
package org.zerock.myapp.package3;
//A클래스로부터 인스턴스 객체를 생성하여, 필드의 초기값으로 사용
public class B { // 같은 패키지 내 다른 클래스
A a1 = new A(true); // ok! : public 생성자 호출
A a2 = new A(100); // ok! : default 생성자 호출
// A a3 = new A("뭐야"); // 컴파일 오류 : private 생성자는 같은 패키지 내에 있더라도 보이지 않는다.
} // end class
package org.zerock.myapp.package4;
import org.zerock.myapp.package3.A;
public class C { // 다른 패키지
A a1 = new A(true); // OK! 단, 같은 패키지 내에 없기에 import문을 사용해야 한다.
// A a2 = new A(700); // 컴파일 오류 : A(int b){;;}는 default 접근제한자이기에 사용이 불가능하다.
// A a3 = new A("뭐야"); // 컴파일 오류 : private로 감추어져 있어 불가능하다.(캡슐화)
} // end class
05. 접근 제한자 - 메소드
package org.zerock.myapp.package5;
public class A {
public int field1;
int field2;
private int field3;
// 메소드
public void method1 () {;;}
void method2() {;;}
private void method3() {;;}
} // end class
package org.zerock.myapp.package5;
public class B {
B() {
A a = new A();
System.out.println(a.field1); // OK! : public field
System.out.println(a.field2); // OK! : default field
// System.out.println(a.field3); // XX! : private field
// ==================================================================
a.method1(); // OK! : public method invocation
a.method2(); // OK! : default method invocation
// a.method3(); // XX! : private method invocation
} // constructor
} // end class
package org.zerock.myapp.package6;
import org.zerock.myapp.package5.A;
public class C {
C () {
A a = new A(); // 다른 패키지에서는 import문!
System.out.println(a.field1); // OK! : public field
// System.out.println(a.field2); // XX! : default field : 다른 패키지 내에 있기에 불가능
// System.out.println(a.field3); // XX! : private field : 다른 패키지 다른 클래스이기에 불가능
// ==========================================================================================
a.method1(); // OK! : public method invocation
} // constructor
} // end class
06. Getter와 Setter
package Practice;
// 클래스의 필드에 대해서 Getter / Setter를 선언하면! (***)
// 이 클래스를 자바빈즈 ( Java Beans ) 클래스라고 하며,
// 이 Getter / Setter에 의해서, 필드(속성)이 아니라, "프로퍼티(Property)"라고 하는 개념이 생기게 된다.
// 프로퍼티는 getter에서 getSpeed에서 get을 지우고 뒤의 문자를 소문자로 바꾸어 생긴 speed를 의미하며,
// 필드명과 프로퍼티의 이름은 다를 수 있다.
// 프로퍼티를 쓰는 이유는 보호하기 위해서이다.
public class Car {
// 1. 상태필드
private int speed;
private boolean stop;
// 생성자 - 기본 생성자를 의존
// 메소드 - 기능 / 행위 구현
// 1. Getter는 왜 필요한가? : 필드의 값을 변환해서 줘야할 경우가 많다.
private int getSpeed() { // getter
return speed;
} // get Speed
// 2. Setter는 왜 필요한가? : 필드의 값을 변환해서 줘야할 경우가 많음.
public void setSpeed( int speed ) { // 이러한 과정을 통해 값이 유효하게 만들어 준다.
if(speed < 0) { // 차의 속도가 0 미만일 수가 없기에
this.speed = 0;
return;
} else {
this.speed = speed;
} // if else
} // set speed
// 3. boolean 타입의 필드에 대한 Getter 이름은 "is필드명"으로 정한다!! (**)
public boolean isStop() {
return stop;
} // isStop
public void setStop(boolean stop) {
this.stop = stop;
this.speed = 0;
} // setStop
} // end class
07. 어노테이션
package org.zerock.myapp.annotation;
public @interface Myannotation { // 어노테이션 (***)
// 속성 ( 정확히는 엘리먼트 ) 선언 ( like field )
String value() default "-"; // 기본속성 (**)
// 뒤에 ();를 붙어야 한다.
// Annotation은 default 값이 설정되어 있지 않으면, 반드시!!! 값을 줘야 한다!! (**)
int number () default 30; // 기본값 설정
} // end annotation
package org.zerock.myapp.annotation;
public class Service { // 어노테이션 응용 (***)
// 어노테이션을 쓸 때에는 @ + 어노테이션명
// @Myannotation
// @Myannotation(value = "Yoseph" , number = 100) // 기본값을 설정하지 않았으면, 값을 이렇게 지정해야 한다. 순서상관X
// 기본 속성만 값이 지정되지 않을때는 ( "Yoseph" )로 작성할 수 있지만, 그 외는 위와 같이 작성해야 한다. (***)
// 어노테이션은 주로 클래스에 붙여 사용한다.
// 어노테이션은 위치를 지정하지 않으면 클래스 내 필드나 메소드 등 아무곳이나 붙일 수 있으나, 위치를 지정하는 것이 좋다.
@Myannotation
public void instanceMethod() {;;} // instanceMethod
} // end class
+ 1차 시험 후기
KH에서 진도를 나감에 따라 드디어 첫 번재 시험을 보게 되었다. 첫번째 시험은 "1. 프로그래밍 언어 활용"으로 시험은 주로 서술형을 이루어졌는데, 기본적인 이론에 대한 서술형 문제와 코드를 보고 오류가 뜨는 이유에 대해서 원인을 파악하는 서술형 문제로 이루어 졌다. 시험 난이도는 매우 어려운 편은 아니었지만, 시험 범위 내에서 골고루 나온다는 느낌을 받았다.
참고로 KH에서는 진도에 따라서 NCS 기준 시험을 보게 되는데, 이때 60점 이하로 맞으면 2차 시험을 봐야 하며 2차에도 60점 이하를 맞게 되면 경고를 받게 된다. 이때 경고를 몇 번 받게 되면 학원에서 퇴출당한다고 하니 주의하는 것이 좋을 것 같다. 현재 코로나로 인해 비대면으로 시험보는 인원수가 대다수를 차지하고 있는데, 비대면으로 시험을 치를 때는 카메라를 키고 시험을 봐야 한다는 점을 주의해야 될 것 같다. 시험시간은 선생님에 따라서 달라지는데, 나의 경우에는 1시간 30분 동안 시험을 치르게 되었다. 다행히 이번에는 시간이 부족하지는 않았으나, 점차 1달에 2-3번 시험을 봐야하는 달도 있고 범위도 다양해질 수 있으니 미리 조금씩 복습해야 될 필요가 있다고 생각한다.
'KH 정보교육원 [ Java ]' 카테고리의 다른 글
KH 14일차 - 상속 (0) | 2022.03.17 |
---|---|
KH 13일차 - 어노테이션 (0) | 2022.03.16 |
KH 11일차 - 정적 초기화 블록과 상수 + 간단한 10일 후기 (0) | 2022.03.11 |
KH 10일차 - 생성자 및 인스턴스 / 정적 멤버 (0) | 2022.03.10 |
KH 09일차 - 클래스와 필드 (0) | 2022.03.09 |