본문 바로가기
JAVA SE/Code

[20.07.14/Day_05] Java SE / Variable Scope, 객체 초기화, Relationship association, aggregation

by 파프리카_ 2020. 7. 14.
728x90
반응형

Variable Scope

// <package> 의미있는 디렉토리 별로 클래스를 분류하기 위해 명시
package step1;

// <class> 일반적으로 객체 생성을 위한 틀을 위해 정의한다
public class Person {
	/*  < instance variable 인스턴스 변수 >
	 *  객체의 속성정보를 저장 : 객체의 정보를 유지하기 위해 !
	 *  class level에서 선언됨
	 *  java 메모리 영역 중 Heap영역(동적 메모리 영역)에 저장
	 *  선언만 해도 자동 기본 초기화된다
	 *  String은 참조형이므로 null로 초기화됨
	 */
	private String name;
	
	public void eat() {
		/* < local variable 지역변수 >
		 * 메소드에서 일시적으로 사용하기 위해!
		 * method level에서 선언됨 
		 * method 실행 시에 일시적으로 사용된 후, 메모리에서 해제된다.
		 * java 메모리 영역 중 Stack영역에 저장
		 */
		int count = 2;
		System.out.println(count+"인분을 먹다.");
	}
	
    // name : local variable | parameter 지역변수, 매개변수, 파라미터 
	public void setName(String name) {
		// this.name : this는 현재 객체를 가리키므로 인스턴스 변수 name을 지칭
		// name : 지역변수이자 매개변수를 가리킨다.
		this.name = name;
	}
	
	public String getName() {
		// name : 인스턴스 변수를 가리킨다.
		return name; 
	}
	
	public void sleep() {
		/* 지역변수 time은 초기화 되어있지 않으므로, compile error
		 * int time; 
		 * System.out.println(time);
		 */
		int time2 = 8; // 이와같이 명시적 초기화가 필요하다.
		System.out.println(name+"는 "+time2+"시간을 자다");
	}
	
	public void testVariable() {
		// 인스턴스 변수 name에 접근하여 사용
		System.out.println(name);
		/* sleep method 의 지역변수인 time2에 접근해보자 
		 * time2 지역변수는 해당 메서드에서만 임시로 사용하므로 
		 * 다른 메서드에서는 사용할 수 없다. // compile error
		 * System.out.println(time2);
		 */
		sleep(); // 한 메서드에서 다른 메서드 호출은 가능
	}
}

 

package step1;

/* <class>
 * 메인 메서드가 존재하는 class로써,
 * 프로그램의 실행을 위해 정의한다.
 */
public class TestVariableScope {
	public static void main(String[] args) {
		/* p 
		 * <local variable>
		 * 메인 메서드 내에 선언되어 있기때문
		 * <참조 변수 reference variable>
		 * 객체의 주소값을 저장하므로 
		 */		
		Person p = new Person();
		p.setName("아이유");
		System.out.println(p.getName());
		System.out.println("\n--eat 메서드 호출--");
		p.eat();
		System.out.println("\n--sleep 메서드 호출--");
		p.sleep();
		System.out.println("\n--testVariable 메서드 호출--");
		p.testVariable();
	}
}

객체 초기화

 

\car.java

package step2;

public class Car {
	// < 인스턴스 변수 >
	// boolean type
	// 선언만하면 기본 초기화 false로 지정됨
	private boolean flag;
	// 실수형 : 0.01(default)
	private double price;
	// 참조형 : null(default)
	private String model;
	
	// getter&setter 단축키 : alt + shift + S
	// boolean형은 get메서드가 아니가 is메서드를 정의
	public boolean isFlag() {
		return flag;
	}

	public void setFlag(boolean flag) {
		this.flag = flag;
	}

	public double getPrice() {
		return price;
	}

	public void setPrice(double price) {
		this.price = price;
	}

	public String getModel() {
		return model;
	}

	public void setModel(String model) {
		this.model = model;
	}
}

 

\TestObjectInit.java

package step2;
/*
 * 객체 생성 초기화 variable initialize 단계를 공부하는 예제
 */
public class TestObjectInit {
	public static void main(String[] args) {
		/* 
		 * Car : 클래스명, 참조형 DataType
		 * car : 지역 변수, 참조 변수
		 *  =  : 할당 or 대입
		 * new : java keyword
		 * Car() : 생성자 Constructor
		 */
		Car car = new Car();
		
		// flag는 인스턴스 변수이다
		// 별다르게 명시해주지 않았기에,
		// boolean의 기본 초기화인 false가 된다.
		System.out.println(car.isFlag()); //false
		
		// price는 실수형이므로, 
		// 기본초기화 0.0
		System.out.println(car.getPrice()); //0.0
		
		// model은 참조형이므로, 
		// 기본초기화 null
		System.out.println(car.getModel()); //null
	}
}

 

** 연습

\Friend.java

package step3;

public class Friend {
	// 인스턴스 변수
	private String name;
	private int age;
	
	// 생성자
	public Friend(String name, int age) {
		this.name = name;
		this.age = age;
	}
	
	// setter, getter
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name=name;
	}
	
	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}
}

 

\TestObjectnit2.java

package step3;

// 객체 초기화 단계 공부 예제
public class TestObjectInit2 {
	public static void main(String[] args) {
		Friend f = new Friend("밀크", 10);
		System.out.println(f.getName()+" "+f.getAge()+"세");
	}
}

[ Relation ]

Association

 

\TestAssociation.java

package step5;

public class TestAssociation {
	public static void main(String[] args) {
		Person p = new Person();
		p.tour("BMW");
	}
}

 

\RentCar.java

package step5;

public class RentCar {
	private String model;
	public RentCar(String model) {
		this.model = model;
	}
	public String getModel() {
		return model;
	}
	public void setModel(String model) {
		this.model = model;
	}	
}

 

\Person.java

package step5;

public class Person {
	/*
	 * Association 관계(use a)는 
	 * '사람이 렌트카를 사용하다'와 같이,
	 * 메서드에서 일시적으로 RentCar객체를 사용하므로
	 * association 관계이다.
	 */
	public void tour(String item) {
		RentCar car = new RentCar(item);
		System.out.println(car.getModel()+" 타고 여행하다");
	}
}

Aggregation

 

 

\TestAggregation.java

package step6;
/*
 * 객체 간의 관계
 * association > aggregation
 * use a		 has a
 */
public class TestAggregation {
	public static void main(String[] args) {
		// 사람은 스마트 폰을 가지고 사용한다
		// 필요한 Class는? Person, SmartPhone
		Person p = new Person("이동욱");
		System.out.println(p.getName()); // 이동욱
		
		p.setSmartPhone(new SmartPhone("갤9", 100));
		System.out.println(p.getSmartPhone().getModel()); // 갤9
		
		// 이동욱님의 폰 가격을 출력해보자
		System.out.println(p.getSmartPhone().getPrice()+"원"); //100원
	}
}

 

Person.java

package step6;

public class Person {
	private String name;
	// SmartPhone은 클래스명이자 참조형 데이터 타입이다!
	private SmartPhone smartPhone;
	
	public Person(String name) {
		this.name = name;
	}
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}

	public SmartPhone getSmartPhone() {
		return smartPhone;
	}

	public void setSmartPhone(SmartPhone smartPhone) {
		this.smartPhone = smartPhone;
	}
}

 

\SmartPhone.java

package step6;

public class SmartPhone {
	private String model;
	private int price;
	
	public SmartPhone(String model, int price) {
		this.model = model;
		this.price = price;
	}
	public String getModel() {
		return model;
	}
	public void setModel(String model) {
		this.model = model;
	}
	public int getPrice() {
		return price;
	}
	public void setPrice(int price) {
		this.price = price;
	}
	
}

Composition

 

\TestComposition.java

package step2;

public class TestComposition {
	public static void main(String[] args) {
		Car car = new Car("소나타");
		System.out.println(car.getModel()); // 소나타
		System.out.println(car.getEngine()); // 엔진 주소값
		System.out.println(car.getEngine().getType()); // L4
		System.out.println(car.getEngine().getDisplacement()); // 2000

	}
}

 

\Car.java

package step2;

public class Car {
	private String model;
	private Engine engine;
	
	/*
	 * Car와 Engine은 Composition(consist of)관계 
	 * Car 생성자(Car객체 생성 시 실행되는 요소)가 실행될 때
	 * 먼저 Engine 객체부터 생성되도록 구성한다
	 */
	public Car(String model) {
		this.model = model;
		this.engine = new Engine("L4", "2000");
	}
	
	public String getModel() {
		return model;
	}
	public void setModel(String model) {
		this.model = model;
	}
	public Engine getEngine() {
		return engine;
	}
	public void setEngine(Engine engine) {
		this.engine = engine;
	}
	
	
}

 

\Engine.java

package step2;

public class Engine {
	private String type;
	private String displacement;
	
	public Engine(String type, String displacement) {
		this.type = type;
		this.displacement = displacement;
	}

	public String getType() {
		return type;
	}

	public void setType(String type) {
		this.type = type;
	}

	public String getDisplacement() {
		return displacement;
	}

	public void setDisplacement(String displacement) {
		this.displacement = displacement;
	}
	
}
728x90
반응형