본문 바로가기

[2016 - 2019] 학부 정리/Java

18.01.10 자바 - 필기02

1. 생성자 - 이것이 자바다 6.7

Point2D pt = new Point2D(); // 객체 생성 -> Point2D() : 생성자


//기본 생성자

public Point2D() {

}

//이미 컴파일러 안에서 기본 생성자를 만든것 처럼 사용

----------------------------------------------------------------------------

package oop5;


public class Point2D {

int x;

int y;

//새로운 생성자를 만들때에는 기본 생성자를 꼭 만들어 주자!!

//public Point2D() {} //=> 기본 생성자(default생성자 : 컴파일러가 만들어준 생성자)

//생성자 constructor

public Point2D() {

this(100,200); //생성자 오버로딩, 메모리의 초기화 이기때문에 무조건 생성자를 먼저 호출해줘야 한다.

System.out.println("Poin2D()");

}

public Point2D(int x, int y) {

//super(); //object클래스에서 먼저 수행하고 오겠다. 이런뜻 지워도 됨

this.x = x;

this.y = y;

System.out.println("Point2D(x,y) 수행중..");

}


//toString ovverride

@Override

public String toString() {

return x+","+y;

}

}

-----------------
package oop5;

public class Point3D extends Point2D{
private int z;
public Point3D(){
this(1, 1, 1);
System.out.println("Point3D 수행중..");
}//기본생성자

public Point3D(int x, int y, int z) {
super(x,y);
this.z = z;
System.out.println("Point3D(x,y,z) 수행중..");
}
@Override
public String toString() {
return super.toString() + "," + z;
}
}
-----------------
package oop5;

public class PointTest {
public static void main(String[] args) {
// Point2D pt = new Point2D(10,20);
// System.out.println(pt);

Point2D pt2 = new Point2D();
System.out.println(pt2);
// Point3D pt3 = new Point3D();
// System.out.println(pt3);
// Point3D pt4 = new Point3D(1000,2000,3000);
// System.out.println(pt4);
}
}
--> 수행순서와 찍히는 순서는 되돌아 오면서 찍히기 때문에 역순일 수 있다.

------------------------------------------------------------------------------------------

p.236

정적멤버 : 미리 메모리에 만들어짐

동적 : 수행중에 할당(new같은거)

package oop6;


public class Account {

int money1;

static int money2; //누적이되고 있다. static은 저장소를 따로 갖는다. 

   //프로그램에 따로 저장하고 인스턴스가 모두 공유한다. | 처음실행될때부터 만들어져 있음


public Account(int money) {

money1 += money;

money2 += money;

}


@Override

public String toString() {

return money1 + ", " + money2;

}

}

-------------

package oop6;


public class AccountTest {

public static void main(String[] args) {

//System.out.println(Account.money1);//에러

System.out.println(Account.money2);

Account a1 = new Account(1000);

System.out.println(a1);

Account a2 = new Account(1000);

System.out.println(a2);


Account a3 = new Account(1000);

System.out.println(a3);

}

}

--------------------------------------------------------------------------------------------------
JVM 메모리 사용역역 -> ppt확인
가비지 컬렉터 
wrapper , Boxed primitive
인스턴스 변수, 참조하는 것이 없으면 사라져버림
인스턴스에 이름을 붙이는 이유가 참조하는 갯수를 카운팅 해야함
->가비지 컬렉터에서 감시하고 있다가 없앰

---------------------------------------------------------------------------------------------------

abstract :추상화 왜쓰냐? 무조건 그 타입,이름으로 메소드를 만들어 버리면 그 이름과 메소드로 무조건 만들어야 함

추상메소드가 하나라도 존재하면 클래스도 무조건 추상클래스로 해줘야 함

package oop4;


//추상클래스 -> 반드시 오버라이딩 해줘야 함

//@ : 오타치는거 발견해줌

public abstract class Shape {

double res; // 넓이 저장

//추상메소드 -> 바디가 없는 메소드

public abstract double area();

}


//추상클래스를 첫번째 상속받는 쪽
package oop4;

public class Circle extends Shape {
int r=10;

@Override 
public double area() {
return r*r*3.14;
}
}

---------------------------------------------------------------------------------------------------------

표준을 만드는것, 규격을 만드는것 : 인터페이스

LgTV, SamsungTV.. -메소드가 다를수 있음

업캐스팅, 다운캐스팅이 가능해짐

변경이 가해질 클래스는 표준 인터페이스를 만들고, 미리 업캐스팅을 해놓는게 좋음

------

package oop7;


//저장이 잘되면 규격에 올바르게 사용한 TV임을 알수있다.

public class LgTV implements TV{

public void powerOn() {

System.out.println("LgTV : 전원을 켭니다");

}


public void powerOff() {

System.out.println("LgTV : 전원을 끕니다");

}


public void channelUp() {

System.out.println("LgTV : 채널을 올립니다");

}


public void channelDown() {

System.out.println("LgTV : 채널을 내립니다");

}


public void soundUp() {

System.out.println("LgTV : 소리를 키웁니다");

}


public void soundDown() {

System.out.println("LgTV : 소리를 줄입니다");

}

}

---------
package oop7;

//TV라는 표준 규격
//바디가 없으니 -> 추상메소드
//인터페이스는 추상메소드임을 알고있으니까 필요 없음, 더이상 적지 않음
public interface TV {
public abstract void powerOn();
public abstract void powerOff();
public abstract void channelUp();
public abstract void channelDown();
public abstract void soundUp();
public abstract void soundDown();
}
-------
package oop7;

public class TVUser {
public static void main(String[] args) {
TV tv = new LgTV(); //업캐스팅
tv.powerOn();
tv.channelUp();
tv.channelUp();
tv.soundUp();
tv.soundUp();
tv.soundDown();
tv.powerOff();
}
}
---------
package oop7;

//저장이 잘되면 규격에 올바르게 사용한 TV임을 알수있다.
public class SamsungTV implements TV{
public void powerOn() {
System.out.println("SamsungTV : 전원을 켭니다");
}

public void powerOff() {
System.out.println("SamsungTV : 전원을 끕니다");
}

public void channelUp() {
System.out.println("SamsungTV : 채널을 올립니다");
}

public void channelDown() {
System.out.println("SamsungTV : 채널을 내립니다");
}

public void soundUp() {
System.out.println("SamsungTV : 소리를 키웁니다");
}

public void soundDown() {
System.out.println("SamsungTV : 소리를 줄입니다");
}
}
-> 변경에 대한 열린 구조가 된다. 일종의 다형성임!
업캐스팅 가능, 변경이 가해질 수 있는 클래스가 존재할때
-------------------------------------------------------------------------------------------------