[day11 수업내용]

StaticTest

public class StaticTest {

	public static void main(String[] args) {
		TestB.printNum2();
		//객체 멤버변수 num1을 호출	=> 객체를 생성한 후, 멤버변수를 호출할 수 있음
		//객체 생성 없이 객체 멤버변수를 호출할 수 없다.
		
		TestB t1 = new TestB ();
		t1.num1 = 10;
		t1.num2 = 30; //이렇게 객체를 통해서 클래스멤버변수(정적)를 호출을할 수도 있음 //가능은 하지만 이런 방법으로 클래스 멤버변수를 잘 사용하지 않음
		//정적(클래스) 멤버변수 num2를 호출 => 클래스 이름을 통해 호출
		//객체 생성이 필수가 아님
		TestB t2 = new TestB ();
		TestB.num2 = 20;
		
		//TestB.t2 = new TestB();//그림설명을 위해 하나 추가함
		
		t2.printNum1();			
		TestB.printNum2();	
	}

}
class TestB{
	//객체 멤버 변수 정수 num1를 선언
	public int num1;
	
	//(클래스 멤버변수)정적 멤버 변수 정수 num2를 선언
	public static int num2;
	
	public void printNum1() {
		//객체 멤버변수는 객체 메소드에서 사용 가능 
		System.out.println("num1 :" + num1);
		
		//클래스 멤버변수/메소드는 객체 메소드에서 사용 가능
		num2=20;
		printNum2();
	}
	
	public static void printNum2() {
		//클래스 멤버변수는 클래스 메소드에서 사용 가능
		System.out.println("num2 :" + num2);
		
		//객체 멤버변수/메소드는 클래스 메소드에서 사용 불가능
		//num1=10;		//에러발생
		//printNum1();	//에러발생
		
		
	}

}

ThisTest

public class ThisTest {

	public static void main(String[] args) {
		TestA t = new TestA(5);	//num에 5가 들어가길 바래서 5 넣음 => 근데 안들어감ㅋ num=num이래서 => this.num=num 은 들어감
		t.print(); 
		
	}
}

class TestA{
	private int num;	//멤버변수 num
	//test할거라 번거로워서 get, set안만들고 생략하고 밑에 할라는것만 하께여
	
	public TestA(int num) {	//매개변수 num
		//멤버 변수 num에 매개변수 num의 값을 저장
		//메소드에서 우선순위는 멤버변수보다 매개변수가 높다.
		//num = num; => 이렇게쓰면 멤버변수 = 매개변수 가 아니라, 매개변수 = 매개변수가 됨
		this.num = num; //멤버변수 이름이랑 매개변수랑 이름이 다르면 안써도 돼 
		
	}
	public void print() {
		System.out.println("num : " + num );
	}
}

MethodTest

public class MethodTest {

	public static void main(String[] args) {

		int res = sum(1,2);
		System.out.println(res);	
		
		//System.out.println(print());	//return값이 없는데 println이 달라고하니까 오류가 남
		//int num = print();				//print 리턴타입이 void없는데 int num에 저장할라하니까 오류가 남. //int가 아니더라도 =을 기준으로 왼쪽 오른쪽 타입이 서로 다르면 안돼 
		print();	//걍이렇게 쓰면 sysout Hello가 바로 출력됨
		
		int []arr=new int[] {1,2,3,4,5};
		System.out.println(sum2(arr));			//sum2는 arr[]를 만들고 써야 함
		
		System.out.println(sum3(1,2,3));		//sum3는 배열 만들어도되고, 내가 직접 배열 값을 입력해도 됨
		System.out.println(sum3(1,2,3,4,5));
		
	}

	public static int sum( int num1, int num2) {
		return num1+num2;
	}
	public static void print() {
		System.out.println("Hello");
	}
	public static int sum2(int []arr) {
		if(arr==null) {							//배열만들고나서 배열이 비지 않았는지 sum3과 다르게 확인을 해줘야 함
			return 0;
		}
		int res=0;
		for(int tmp:arr) {
			res+=tmp;
		}
		return res;
	}
	//혼공자 (p.252)
		public static int sum3(int ...arr) {	//...를 사용해서 매개변수의 갯수를 모를때 자동으로 만들기 
		int res=0;
		for(int tmp:arr) {
			res+= tmp;
		}
		return res;
	}
}

MethodOverloadingTest

public class MethodOverloadingTest {
	public static void main(String[] args) {
		Point2 pt = new Point2();
		pt.print();
	
		pt.move(4, 5);
		pt.print();
	
		Point2 pt2 = new Point2(10,20);
		pt.move(pt2);
		pt.print();
	
		System.out.println(1);		//println이라는 이름으로 뒤에 int 1
		System.out.println("1"); 	//String 1
		System.out.println('1');	//char 1
	}
}
class Point2{
	private int x, y;		//자동으로 초기값 int는 0들어감
	public Point2() {
		this(0,0);
}

public Point2(int x, int y) {
	this.x = x;
	this.y = y;
}

public Point2(Point2 pt) {	//복사생성자, public 클래스명(클래스명 객체명){}
	this(pt.x, pt.y); 		// this() 생성자는 항상 첫줄에 놔줘야 함
}
public void print() {
	System.out.println("( " + x + "," + y + " )");
}
/* 기능    : 이동할 x, y 좌표가 주어지면 해당 좌표로 이동하는 메소드
 * 매개변수 : 이동할 x, y 좌표 => int x, int y
 * 리턴타입 : 없음 => void
 * 메소드명 : move
 * */
public void move(int x, int y) {
	this.x=x;
	this.y=y;
}

/* 기능    : 이동할 좌표가 Point2의 객체로 주어지면 해당 좌표로 이동하는 메소드
 * 매개변수 : 이동할 좌표 Point2의 객체 => Point2 pt
 * 리턴타입 : void
 * 메소드명 : move
 * */
public void move(Point2 pt) { //pt도 Point2로 만들어졌기때문에 Point2가 private이더라도 같은 클래스라서 Point2에 직접 접근할 수 있다
	x = pt.x;
	y = pt.y;

//move라는 메소드가 2개임. => 메소드 오버로딩
 }
}

ConstructorOverloading

public class ConstructorOverloadingEx1 {

	public static void main(String[] args) {
		A a1 = new A();			// 기본생성자 씀
		A a2 = new A(1,2);		// 밑에 생성자 쓰려면, 정수 두개를 전달해야 함.
		A a3 = new A(1.0, 2);	// 실수가 정수로 자동형변환이 안되기 때문에 에러 발생 
		A a4 = new A('a', 3);	// 문자가 정수로 자동형변환이 되기 때문에 에러 발생하지 않음
		A a5 = new A(a1);
	}

}
class A{
	private int num1;	
	private int num2;	
	
	
	
	public int getNum1() {
		return num1;
	}

	public void setNum1(int num1) {
		this.num1 = num1;
	}

	public int getNum2() {
		return num2;
	}

	public void setNum2(int num2) {
		this.num2 = num2;
	}
	
	

	public void A() {}	//생성자와 이름이 같은 메소드
	
	public A() {}		//기본 생성자
	
/*	public A(int num3, int num4) {	//기본생성자와 매개변수 갯수가 다른 생성자 
		num1 = num3;
		num2 = num4;
	}	*/
	
	public A(int num1, int num2) {
		super();
		this.num1 = num1;
		this.num2 = num2;
	}
	//복사 생성자 : 생성자의 매개변수로 같은 클래스의 객체가 오는 경우
	public A(A a) {			//class A를 통해서 만들었는데 A클래스에는 객체변수 num1, num2 두개가 있음. 그리고 이 복사생성자는 a라는 객체의 멤버변수 값을  num1,num2에 넣어.
		num1 = a.num1;		
		num2 = a.num2;
	}
	
	
	public A(double num10, double num11) {	// int 2개짜리 매개변수 가진 생성자와 다른 타입(하나만 달라도 가능)의 매개변수를 가진 생성자
		
	}
}

Singleton *다시해야돼

public class SingletonTest {

	public static void main(String[] args) { //혼공자 272p.
		/* 싱글톤 : 전체 프로그램에서 단 하나의 객체만 있어야 하는 경우에 만든
		 * 			단 하나의 객체 (= 전체를 통틀어서 하나만 있어야 하는 경우)
		 * 1. 싱글톤을 만드려면 생성자의 접근제한자를 private으로 해서 외부에서 생성자를 호출할 수 없게 한다.
		 * 2. 클래스의 멤버변수로 해당 클래스의 클래스 변수를 만듦.
		 * 3. 클래스 변수를 가져오는 메소드를 선언 및 구현
		 * */

		//Singleton s = new Singleton();	
		//일반적으로 객체 만드는 법, 에러발생 => 생성자의 접근제한자가 private여서 호출이 불가능
		//이때 Singleton 클래스 안에 Singleton 객체를 생성
		Singleton s1;
		//이미 만들어진 Singleton 객체를 가져옴
		s1 = Singleton.getSingleton();
		//이미 만들어진 Singleton 객체를 가져옴
		Singleton s2 = Singleton.getSingleton();
		if(s1==s2) {
			System.out.println("같은 객체입니다.");
		}
		Point2 p = new Point2();
	}

}
class Singleton{
	//2. 클래스의 멤버변수로 해당 클래스의 클래스 변수를 만듦
	private static Singleton singleton = new Singleton();
	//1. 싱글톤을 만드려면 생성자의 접근제한자를 private으로
	private Singleton() {}
	//3. 클래스 변수를 가져오는 메소드를 선언 및 구현
	public static Singleton getSingleton() {
		return singleton;
	}
	
}

싱글톤 언제씀? 왜씀? 전체 프로그램에서 단 하나의 객체만 있어야하는데 왜?