본문 바로가기
자바과정/Java

Java 기초 - 5일차

by Parkej 2021. 2. 3.

--------------------------this 보완

-- 내 코드

 ------ this에 대한 실습코드
public class ThisCall {
	//field
	private int i,j;

	//constructor
	//오버로딩
	public ThisCall() {

	}
	public ThisCall(int i) {
		this.i = i;
	}
	public ThisCall(int i, int j) {
		this.i = i;
		this.j = j;
	}
	
	//method
	public int getA()
	{
		return i;
	}
	public int getB()
	{
		return j;
	}


	public static void main(String[] args) {

		ThisCall tc1 = new ThisCall();
		ThisCall tc2 = new ThisCall(1);
		ThisCall tc3 = new ThisCall(2, 5);

		System.out.println(tc1.getA() + "\t" + tc1.getB());// 0,0
		System.out.println(tc2.getA() + "\t" + tc2.getB());// 1,0
		System.out.println(tc3.getA() + "\t" + tc3.getB());// 2,5
	}

}

 

-- 강사님 코드

public class ThisCall {
	private int a;
	private int b;

	// ab를 초기화하는게 공통
	public ThisCall() {
//		a=b=0;
		this(0,0); // 생성자에서 생성자 호출
	} 
	public ThisCall(int a) {
//		this.a = a;
//		b=0;
		this(a,0); // 관리가 쉬워짐, 유지보수
	}
	public ThisCall(int a, int b) {
		this.a = a;
		this.b = b;
	}

	public int getA() {
		return a;
	}
	public int getB() {
		return b;
	}

	public void setA(int a) {
		this.a = a;
	}
	public void setB(int b) {
		this.b = b;
	}

	public static void main(String[] args) {

		ThisCall tc1 = new ThisCall();
		ThisCall tc2 = new ThisCall(1);
		ThisCall tc3 = new ThisCall(2, 5);

		System.out.println(tc1.getA() + "\t" + tc1.getB());// 0,0
		System.out.println(tc2.getA() + "\t" + tc2.getB());// 1,0
		System.out.println(tc3.getA() + "\t" + tc3.getB());// 2,5
	}

}

 

 

--- 정리

public class ThisExam01 {
	
	private int a;
	
	// setter
	public void setA(int a) { // (ThisExam this, int aa)
		this.a = a; // 필드 a인지 명확하게 구분지으려고 this를 썼음.
		// this를 쓰지 않으면 우선순위가 매개변수임.
	}
	// getter
	public int getA() { // getA(ThisExam this)
		return this.a;
	}
	
	public ThisExam01 getObject() {
		return this; // 자기자신의 객체를 리턴할때
	}
	public static void main(String[] args) {
		
		ThisExam01 te = new ThisExam01(); // 생성자 호출
		
		te.setA(10); // te.setA(te, 10)
		
		System.out.println(te.getA());

	}

}


/*
 * this, this()
 *  - 인스턴스 메소드에 첫번째 매개변수
 *  - 자기 자신을 접근하는 레퍼런스 
 *  
 * this
 * : instance method의 첫번째 매개변수로 항상 존재
 * : 만들수는 없고 사용만 가능
 * 
 * this
 * 1. 매개변수 이름과 필드 이름이 같을 경우
 * 2. 인스턴스 메소드에서 자기자신의 객체를 리턴할떄
 * 
 * this() 자기 자신을 호출
 * : 생성자 호출됨.
 * : 생성자에서 또다른 생성자를 호출(내 자신의 생성자)
 * : 이유 : 유지보수 관리가 쉬워짐
 */

 

-- 스태틱에서 인스턴스 강제접근

// 스태틱에서 인스턴스 변수에 접근하는 방법.
public class ThisExam02 {
	private  int a;

	// 스태틱에서 굳이 인스턴스를 쓰고 싶으면 this 역할을 직접 구현해야함.
	public static void disp(ThisExam02 te) {
		System.out.println(te.a);
		// 스태틱 필드에서 인스턴스 접근 불가
	}
	public static void main(String[] args) {
		
		ThisExam02 te = new ThisExam02();//메모리를 만들었는데에도 못쓴다...왜? this로 객체를 구분해서 해야하는데 없기때문
		te.disp(te);
		//ThisExam02.disp();
	}

}

 

-------------------------- 클래스 관계 (5일차 진도)

 

class A{ // data class
	String n;
	public String getN() {
		return n;
	}
	public void setN(String n) {
		this.n = n;
	}
}
class B{ // data class
	int n;
	public int getN() {
		return n;
	}
	public void setN(int n) {
		this.n = n;
	}
}

public class CallCon {
	// has ~ A 관계
	private A name; // A타입을 가져다 쓰면서 이름 
	private B age; // B타입을 가져다 쓰면서 나이
	
	public CallCon() {
		// 생성자에 객체를 생성과 동시에 필드의 클래스 변수를 초기화 해줘야함.
		name = new A();
		age = new B();
		// 실제 객체를 누가 쓰느냐
	}
	
	
	public void setName(String n) {
		this.name.setN(n);
	}
	public String getName() {
		return this.name.getN();
	}

	public void setAge(int n) {
		this.age.setN(n);
	}
	public int getAge() {
		return this.age.getN();
	}


	public static void main(String[] args) {
		// 사용자
		CallCon cc = new CallCon();

		cc.setName("super");
		cc.setAge(1000);

		System.out.println(cc.getName());
		System.out.println(cc.getAge());
	}

}

/* 5일차
 * 
 * 클래스관계 
 * has ~ a ( ~가 ~를 가지고 있다.) // 리모콘
 *  : 객체가 필요에 의해서 객체를 가져다 쓰는 괸계
 *  
 *  독립된 객체 : 데이터 클래스
 *   - 자기 자신만을 만듦 누군가 가쓴다면 쓸 수 있는 환경을 만들기 (main과 같음)
 *  데이터클래스를 갖다 쓰는 클래스 : 데이터관리클래스
 *  
 * is ~ a  ( ~는 ~이다.)
 * 
 * 
 */
반응형

댓글