본문 바로가기

[2016 - 2019] 학부 정리/Java

18.01.10 자바 - 필기01

-(오늘, 내일 중요!)

-객체지향개념..frame work(sping,android,디자인패턴)..


[클래스-오후]

*객체지향 프로그램 


*자바 객체지향 프로그래밍 특징 3가지

1. 캡슐화(Encapsulation)와 정보은폐(Information Hiding)

2. 상속(Inheritance)

3. 다형성(Polymorphysm)

-최소한의 간단한 프로그램을 짜고 적용!

-ex. 붕어빵

붕어빵 틀 : 클래스(설계도)

붕어빵 : 클래스를 가지고 메모리에 만들어낸 실체instance(객체란 단어..지양.."배에서배..")


클래스

인스턴스


x좌표, y좌표 2개 저장

=클래스 : 붕어빵 틀

package oop;


//x좌표, y좌표 2개 저장

//틀 생성

public class Point2D {

int x;

int y;

}



=인스턴스 : 붕어빵-클래스를 통해 메모리에 만들어진 각각의 실체

package oop;


public class PointTest {

public static void main(String[] args) {

Point2D pt = new Point2D(); // 메모리에 new키워드를 통해 인스턴스 생성, 이름을 붙인거 

pt.x = 5; //실체에 접근

pt.y = 3;

System.out.println("x : "+pt.x);

System.out.println("y : "+pt.y);

}

}

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

//캡슐화와 정보은폐

//ex.게보린 성분보단 기능(머리아플때먹지)만 알기

//자동판매기 입출력 확실, 어떤 로직인지 알 필요 없음, 보여줄 필요 없음

//접근제어자 public, private -> 내부 감추기,..

//x,y를 private로 감추고 set, get(저장, 값가져오기)기능만 부여해서 

//그걸로 접근한다.(user입장)

//내부를 감추고 클래스에 어떤기능을 쓸건지 세팅 

//main에서 기능을 가져다가 쓰기만 하면 된다.


package oop;


//x좌표, y좌표 2개 저장

//틀 생성

public class Point2D {

//정보은폐

private int x;

private int y;

//기능 구현

public int getX() {

return x;

}

//멤버변수에 값을 저장

public void setX(int x) {

this.x = x;

}

public int getY() {

return y;

}

public void setY(int y) {

this.y = y;

}


}

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

//상속 extends

//상속이란 개념은 확장이란 의미가 있어야 해, 뭔가가 발전되야 필요하지

//그래서 extends란 키워드를 쓴듯

//z좌표를 추가해서 만들어보자


package oop;

//상속을 받음

//super타입,부모 : 2D | child, 자식,sub타입 : 3D

public class Point3D extends Point2D {


}


package oop;


public class PointTest {

public static void main(String[] args) {

Point2D pt = new Point2D(); // 메모리에 인스턴스 생성, 이름을 붙인거 

pt.setX(5); //실체에 바로접근

pt.y = 3;

System.out.println("x : "+pt.x);

System.out.println("y : "+pt.y);

}

}

//캡슐화와 정보은폐



package oop;


public class PointTest {

public static void main(String[] args) {

Point2D pt = new Point2D(); // 메모리에 인스턴스 생성, 이름을 붙인거 

pt.setX(5); //실체에 바로접근X

pt.setY(3); //메소드를 통해 접근

System.out.println("x : "+pt.getX());

System.out.println("y : "+pt.getY());

}

}

//캡슐화와 정보은폐

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


package oop;

//상속을 받음

//super타입,부모 : 2D | child, 자식,sub타입 : 3D

public class Point3D extends Point2D {

//내부를 감추고

private int z;


//기능을 구현

public int getZ() {

return z;

}


public void setZ(int z) {

this.z = z;

}

}



package oop;


public class PointTest {

public static void main(String[] args) {

Point3D pt = new Point3D(); // 메모리에 인스턴스 생성, 이름을 붙인거 

pt.setX(5); //실체에 바로접근X

pt.setY(3); //메소드를 통해 접근

pt.setZ(4);

System.out.println("x : "+pt.getX());

System.out.println("y : "+pt.getY());

System.out.println("z : "+pt.getZ());

}

}

//캡슐화와 정보은폐(== 캡슐화)

-----------------------------------------------------------------------------------------------------------------------//어제

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

1. 클래스와 인스턴스

class : Point2D

package oop2;


public class Point2D {

int x; //멤버변수 2개

int y;

}


class : PointTest

package oop2;


public class PointTest {

public static void main(String[] args) {

Point2D pt = new Point2D(); // 인스턴스생성(생성자), 클래스를 인스턴스 화 함

pt.x = 100; // 직접 접근

pt.y = 200;


System.out.println("x : " + pt.x + " y: " + pt.y);

}

}


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

2. 캡슐화

class : Point2D

package oop2;


public class Point2D {

private int x; //멤버변수 2개

private int y;

//private -> get,set이용

public int getX() {

return x;

}

public void setX(int x) {

this.x = x;

}

public int getY() {

return y;

}

public void setY(int y) {

this.y = y;

}

}

class : PointTest
package oop2;

public class PointTest {
public static void main(String[] args) {
Point2D pt = new Point2D(); // 인스턴스생성(생성자)
pt.setX(100); // 기능을 접근
pt.setY(200);

System.out.println("x : " + pt.getX() + " y: " + pt.getY());
}
}

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

3. 상속

class : Point3D - 아무것도 없어도 상속받았으니 잘됨, 확장!!

package oop2;


public class Point3D extends Point2D {

}

class : PointTest
package oop2;

public class PointTest {
public static void main(String[] args) {
Point3D pt = new Point3D(); // 인스턴스생성(생성자)
pt.setX(100); // 직접 접근
pt.setY(200);

System.out.println("x : " + pt.getX() + " y: " + pt.getY());
}
}
------------------------------------------------------------------------------------------------------------
class : Point3D -확장버전

package oop2;


public class Point3D extends Point2D {

private int z;


public int getZ() {

return z;

}


public void setZ(int z) {

this.z = z;

}

}

class : PointTest

package oop2;


public class PointTest {

public static void main(String[] args) {

Point3D pt = new Point3D(); // 인스턴스생성(생성자)

pt.setX(100); // 직접 접근

pt.setY(200);

pt.setZ(300);


System.out.println("x : " + pt.getX() + " y: " + pt.getY() + " z :" + pt.getZ());

}

}

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

3. 다형성 - 클래스와 클래스의 형변환

== 메소드 오버라이딩

class : Point2D

package oop2;

//super class - 먼저 만든거, 3D에 있는 Z를 출력X

public class Point2D {

private int x; //멤버변수 2개

private int y;

//private -> get,set이용

public int getX() {

return x;

}

public void setX(int x) {

this.x = x;

}

public int getY() {

return y;

}

public void setY(int y) {

this.y = y;

}

public void print() {

System.out.println("x : " + this.getX());

System.out.println("y : " + this.getY());

}

}

class : Point3D

package oop2;

//child class - 나중에 만든거

public class Point3D extends Point2D {

private int z;


public int getZ() {

return z;

}


public void setZ(int z) {

this.z = z;

}

//메소드

//pt.~ : 자기가 자기 이름 불러서..

//this라고 해야함

//메소드 오버라이딩 method overriding - 메소드 재정의

public void print() {

super.print();

//System.out.println("x : " + this.getX());

//System.out.println("y : " + this.getY());

System.out.println("z : " + this.getZ());

}

}

class : PointTest

package oop2;


public class PointTest {

public static void main(String[] args) {

Point3D pt = new Point3D(); // 인스턴스생성(생성자)

pt.setX(100); // 직접 접근

pt.setY(200);

pt.setZ(300);

pt.print();

}

}

-------------------------------------------------------------------------------------------
class diagram - objectaid
상속관계 확인
다형성 - 클래스의 형 변환 확인
toString : java.lang 자바언어의 기본패키지에 들어있음
class object : 모든 클래스와 오브젝트의 superclass 무조건 최상위 클래스

상속을안받으면 무조건 extends object가 상속된거 


//toString

//업캐스팅

package oop3;


public class AnimalTest {

public static void main(String[] args) {

// Eagle eagle = new Eagle(); 

// System.out.println(eagle); //자동으로 toString이 생성되어 문자열이 출력됨

Bird bird = new  Eagle(); //이글을 버드타입으로 참조 -> Upcasting 

System.out.println(bird);

// Animal animal = new Eagle();

// System.out.println(animal);

Animal animal = bird; // => 재참조, 업캐스팅, 자동형변환

System.out.println(animal);

}

}


//다운캐스팅 - 강제 향변환

//Condor condor = new Eagle(); //이렇게는 안됨

  Condor condor = (Condor) new Eagle(); //다운캐스팅,강제형변환 -> downcasting

      //부모를 자식에서 참조하는 것 : 다운캐스팅 

   //->에러남, 처음부터 다운캐스팅 하면 안됨

그럼 어찌??

     Animal animal = new Eagle();

  System.out.println(animal);

 

  Bird bird = (Bird) animal; //실체가 이글일때 업캐스팅을한 것부터 자기보다 위에 있는 것까지만

  // 다운캐스팅이 가능 즉, 버드까지만 가능하다.

  System.out.println(bird);


// instanceof => 미리 확인하는 연산자

     Object object = new Tiger();

     Object object = new Eagle(); -> 캐스팅 불가능

System.out.println(object); //upcasting, 무조건 Upcating 다된다.

if(object instanceof Tiger) {

System.out.println("Tiger로 캐스팅 가능");

}else {

System.out.println("Tiger로 캐스팅 불가능");

}

//Tiger tiger = (Tiger) object; //가지가 다르기때문에 업캐스팅 불가(자동타입에서)

//System.out.println(tiger); //원래 이글을 오브젝트로 업캐스팅을 하고 타이거로 다운캐스팅을

  //하면 실행을 해야만 알아볼 수 있다. 이걸 미리 알아보는 연산자는 

  //object instanceof Tiger 

//업캐스팅 다운캐스팅

package oop2;


public class PointTest {

public static void main(String[] args) {

Point2D pt = new Point3D(); //업캐스팅은 잘되는데 z에 접근이 안됨

//자식에서 새롭게 만든건 접근이 불가하다.

//원래물려준 2D까지는 접근이 가능하지만 3D에서 새롭게 만든건 X

pt.setX(100); 

pt.setY(200);

//pt.setZ(300); //접근불가

Point3D pt2 = (Point3D) pt; //다운캐스팅

pt2.setX(100);

pt2.setY(200);

pt2.setZ(300); //원래3D꺼여서 접근이 가능하다.

pt.print();

}

}

=> 다형성을 위해서 쓰는거
----------------------------------------------------------------------------------------------------------------------------
oop 패키지랑 필기 확인!! shape!! //오전수업
-----------------------------------------------
package oop4;

public class ShapeTest {
public static void main(String[] args) {
printArea(new Circle());
printArea(new Rectangle());
printArea(new Triangle());
}

public static void printArea(Shape s) { //shape에 대해 업캐스팅이 된거
s.res = s.area();
if(s instanceof Circle) {
Circle c = (Circle) s;
System.out.println("반지름이 "+c.r+"인 원의 넓이는 "+c.res+"입니다.");
}else if(s instanceof Rectangle) {
Rectangle r = (Rectangle) s;
System.out.println("가로가 "+r.w +", 세로가 "+r.h+"인 사각형의 넓이는 "+r.res+"입니다.");
}else if(s instanceof Triangle) {
Triangle t = (Triangle) s;
System.out.println("밑변이  "+t.w +", 높이가 "+t.h+"인 삼각형의 넓이는 "+t.res+"입니다.");
}
}
// Circle c = new Circle();
// printArea1(c);
//
// public static void printArea1() {
// c.res = c.area();
// System.out.println("반지름이  "+c.r ~ );
// }

//원래 배운걸로 코딩하면 각 도형의 객체를 생성하고 각각의 area()를 재정의 하는데 그러지 않고 한번에 정의할때에는
//shape의 상속인 Circle, Rectangle, Triangle을 업캐스팅 한 후에 하나의 메소드로 넣으면 된당!
}