필드와 메소드를 말함인스턴스 맴버는 객체에 소속된 맴버이기 때문에 객체 없이 사용 불가public class Car {
//필드
int gas;
//메소드
void setSpeed(int speed) {...}
}

Car myCar = new Car();
myCar.gas = 10; // 인스턴스 필드
myCar.setSpeed(60); // 인스턴스 메소드
Car yourCar = new Car();
myCar.gas = 20;
myCar.setSpeed(80);
인스턴스 맴버임을 명확히 하기 위해 this.을 붙일 수 있음class Car {
String model;
Car(String model) {
this.model = model;
}
void setModel(String model) {
this.model = model;
}
}
필드와 메소드를 말함정적 맴버는 클래스에 소속된 맴버로, 객체 내부에 존재하지 않고, 메소드 영역에 존재함// 정적 맴버 선언
public class Car {
static model;
static setModel(String model){...}
}
메소드 영역에 고정됨
//정적 맴버 사용
public class Calculator {
static double pi = 3.14159;
static int add(int x, int y){return x+y;}
static int sub(int x, int y){return x-y;}
}
double result1 = 10 * 10 * Calculator.pi;
int result2 = Calculator.add(10, 5);
int result3 = Calculator.sub(10, 5);
객체를 생성하지 말고 클래스를 불러와서 사용
인스턴스 필드정적 필드인스턴스 필드로 작업해야할 메소드 : 인스턴스 메소드인스턴스 필드로 작업하지 않는 메소드 : 정적 메소드public Calculator {
String color; // 필드
void setColor(String color) { this.color = color; }
// static 사용하면 오류남 (this는 인스턴스 맴버를 가르킴)
static int add(int x, int y){ return x+y; }
static int sub(int x, int y){ return x-y; }
}
정적 메소드를 호출할 수 있음static 필드 여러 개 선언 가능static Television {
static String company = "Samsung";
static String model = "LCD";
static String info;
static {
info = company + "-" + model;
}
static {}
static {}
...
}
main() 메소드도 정적 메소드임
public class Car {
int speed;
void run(){};
public static void main(String[] args) {
speed = 60; // 불가능, 객체가 생성 되지 않음
Car myCar = new Car();
myCar.speed = 60;
}
}
new 연산자로 생성자를 호출할 수 없도록 함private 접근 제한자 사용getInstance()를 선언public class Car {
// 정적 필드
private static Car myCar = new Car();
// 생성자
private Car(){...}
// 정적 메소드
static Car getInstance() {
return myCar;
// myCar이 참조하는 객체의 번지가 100이면 100을 리턴
}
}
Car Car1 = new Car(); // 오류
Car Car1 = Car.getInstance(); // 정적 객체 myCar의 번지가 저장

public class Person {
final String nation = "Korea"; // 필드에서 초기화
final String ssn;
public Person(String ssn, String name) {
this.ssn = ssn; // 생성자에서 초기화
}
}
final 필드static final double EARTH_RADIUS = 6400; // 필드에서 초기화
static final double EARTH_SURFACE_AREA;
static { // static 메소드로 초기화
EARTH_SURFACE_AREA = 4 * Math.PI * EARTH_RADIUS * EARTH_RADIUS
}

package 상위패키지.하위패키지;
public class ClassName{...}
_, $을 제외한 특수 문자 사용 xjavac XXX.java
javac -d [패키지 생성 위치] XXX.java
패키지 생성 위치에 폴더가 생성됨
javac -d ../bin ClassName.java
상위(루트) 패키지가 시작하는 곳에서 실행해야 함
java 상위패키지.하위패키지.클래스
java sec12.exam01_package_complile.ClassName
패키지명이 포함된 전체 클래스 이름 사용
package com.mycompany;
public class Car {
com.hankook.Tire tire = new com.hankook.Tire();
}
import 문으로 패키지를 지정하고 사용
package com.mycompany;
import com.hankook.Tire;
//import com.hankook.*;
public class Car {
Tire tire = new Tire();
}



public class ClassName {
public int field1;
int field2;
private int field3;
}
private 접근 제한을 함GetterSetterprivate 필드의 값을 리턴하는 역할getFieldName() 또는 isFieldName() 메소드를 말함boolean 이면 isFieldName()class Car {
private double speed;
public double getSpeed(){return speed;} // Getter
}
class Car {
private boolean stop;
public boolean isStop() {return stop;} // Getter
}
setFieldName(타입 변수) 메소드를 말함class Car {
private double speed;
public void setSpeed(double speed) { // Setter
if(speed < 0) { // 유효성 검사
this.speed = 0;
return;
}else {
this.speed = speed;
}
}
}
어노테이션 타입 정의
public @interface AnnotationName {
}
@AnnotationName
ex)
@Override // 어노테이션
public void toString(){...}
public @interface AnnotationName {
String elementName1();
int elementName2() default 5;
}
@AnnotationName(elementName1 = "값", elementName2 = 3);
@AnnotationName(elementName1 = "값"); // elementName2은 default값 3
valuepublic @interface AnnotationName {
String value();
int elementName() default 5;
}
@AnnotationName("값"); // 기본 엘리먼트 value의 값으로 들어감
value="값" 형태로 기술@AnnotationName(value="값", elementName=3);
java.lang.annotation.ElementType 열거 상수로 정의 되어 있음
@Target 어노테이션으로 적용 대상 지정@Target의 기본 엘리먼트인 value의 타입은 ElementType 배열@Target((ElementType.TYPE, ElementType.FIELD, Element.Type.METHOD))
public @interface AnnotationName {
}
@AnnotationName
public class ClassName {
@AnnotationName
private String fieldName;
// @AnnotationName 불가능 (위에 CONSTRUCTOR(생성자) 타겟 지정이 안되어있음)
public ClassName(){}
@AnnotationName
public void methodName(){}
}
java.lang.annotation.RetentionPolicy 열거 상수로 정의 되어 있음
@Target((ElementType.TYPE, ElementType.FIELD, Element.Type.METHOD))
@Retention(RetentionPolicy.RUNTIME) // 유지 정책 지정
public @interface AnnotationName {}
클래스에 적용된 어노테이션 정보 얻기
클래스.class의 어노테이션 정보를 얻는 메소드 이용필드, 생성자, 메소드에 적용된 어노테이션 정보 얻기
클래스.class의 다음 메소드를 이용 해서java.lang.reflect 패키지의 Field, Constructor, Method 클래스의 배열을 얻어냄
어노테이션 정보를 얻기 위한 메소드

import java.lang.annotation.*;
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface PrintAnnotation {
String value() default "-";
int number() default 15;
}
public class Service {
@PrintAnnotation
public void method1(){
System.out.println("실행 내용1");
}
@PrintAnnotation("*")
public void method2(){
System.out.println("실행 내용2");
}
@PrintAnnotation(value = "#", number = 20)
public void method3(){
System.out.println("실행 내용3");
}
}

import java.lang.reflect.*;
public class PrintAnnotationExample {
public static void main(String[] args) {
Method[] declaredMethods = Service.class.getDeclaredMethods();
for(Method method : declaredMethods) {
if(method.isAnnotationPresent(PrintAnnotation.class)) {
System.out.println(method.getName() + "에는 적용 o");
}else {
System.out.println(method.getName() + "에는 적용 x");
}
}
}
}
