[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;
}
}
싱글톤 언제씀? 왜씀? 전체 프로그램에서 단 하나의 객체만 있어야하는데 왜?