작성자 : 코로세
작성자 : 코로세
' IOT 기반 응용 SW과정 > Group Studying' 카테고리의 다른 글
5. 쓰레드 (0) | 2016.06.17 |
---|---|
은행 관리 프로그램 (0) | 2016.06.14 |
4. 기본 API (0) | 2016.06.09 |
3. 상속, 인터페이스 (0) | 2016.06.09 |
1. Java의 특징, 변수와 타입, 연산자 (0) | 2016.06.09 |
작성자 : 코로세
작성자 : 코로세
5. 쓰레드 (0) | 2016.06.17 |
---|---|
은행 관리 프로그램 (0) | 2016.06.14 |
4. 기본 API (0) | 2016.06.09 |
3. 상속, 인터페이스 (0) | 2016.06.09 |
1. Java의 특징, 변수와 타입, 연산자 (0) | 2016.06.09 |
형변환
부모클래스타입으로 자식객체를 참조했을때는 부모클래스에 존재하는 멤버변수와 멤버함수만 접근이 가능,자식영역에만 존재하는 멤버에 접근불가
자식클래스로의 형변환을 통해 자식에만 존재하는 멤버에 접근가능
* instanceof 연산자를 사용한다. *
[참조변수] instanceof [클래스명] -> 참조변수가 실제 참조하고 있는 객체가 클래스명 타입의 변수로 참조가 가능하면 true 아님 false
추상클래스
추상메소드를 가지고있는 클래스
자바에서의 추상메소드는 abstract 키워드를 붙여준다.
(부모클래스일수록 개념이 추상적이고, 특정 기능이 어떻게 구현될지 애매하다.)
추상클래스는 상속받으면 추상메소드를 구현해야만 하는 의무를 가지게 됨.
(추상메소드를 구현하던, 자기 자신이 추상클래스가 되던)
추상클래스는 미완성의 설계도 이기 때문에 객체를 만들 수 없을(객체화 할 수 없음)
내부클래스
클래스 안에 다른 클래스를 정의
//바깥 클래스 class A { A(){System.out.println("A 객체가 생성됨");}
/**인스턴스 멤버 클래스**/ class B { B(){System.out.println("B 객체가 생성됨");} int field1; //static int field2; void method1(){} //static void method2() {} } //정적 멤버 클래스 static class C { C() {System.out.println("C 객체가 생성됨");} int field1; static int field2; void method1(){} static void method2(){} } void method(){ //로컬 클래스 class D { D(){System.out.println("D 객체가 생성됨");} int field1; void method1(){} } D d = new D(); d.field1 = 3; d.method1();
} } |
public class Main { public static void main(String[] args) { A a = new A();
//인스턴스 멤버 클래스 객체 생성 A.B b = a.new B(); b.field1 = 3; b.method1();
//정적 멤버 클래스 객체 생성 A.C c = new A.C(); c.field1 = 3; c.method1(); A.C.field2 = 3; A.C.method2();
//로컬 클래스 객체 생성을 위한 메소드 호출 a.method(); } } |
무명 클래스(anonymous class)
클래스 몸체는 정의되지만, 이름은 없는 클래스
객체를 생성하면서 클래스를 정의하는 방법(1회성 클래스 구현)
interface RemoteController { void turnOn(); void turnOff(); } class TVRemoteController implements RemoteController{ @Override public void turnOn() {
} @Override public void turnOff() {
}
} public class AnnonymousTest { public static void main(String[] args) { RemoteController rc = new TVRemoteController();
} } |
인터페이스 타입의 참조변수는 자신 인터페이스를 implements한 클래스의 객체를 참조할 수 있음.
대신에 인터페이스 타입의 참조변수로 객체를 참조했을때는 인터페이스에 존재하는 메소드만 호출이 가능.
Day16 패키지 (0) | 2016.04.04 |
---|---|
Day15 전략패턴 (0) | 2016.04.01 |
Day13 상속 (0) | 2016.03.30 |
Day12 변수 (0) | 2016.03.29 |
Day11 (0) | 2016.03.28 |
절차지향
↓
객체지향
(변수 + 함수 / 상속 / 다형성, GOF, 디자인패턴)
↓
프레임워크
(spring)
상속
(어떤 클래스가 다른 클래스의 멤버변수와 멤버함수를 물려 받는 것)
(기존 클래스의 필드와 메소드를 재사용하기 위한 기법)
(기존클래스의 일부 변경도 가능)
(복잡한 GUI 프로그램을 순식간에 작성)
superclass // subclass
부모클래스 // 자식클래스
<is - a 관계>
public class Car { public int speed; public int gear; //3개의 필드 선언 public String color;
//3개의 메소드 선언 public void setGear(int gear) { this.gear = gear; } public void speedUp(int increment) { speed += increment; } public void speedDown(int decrement) { speed -= decrement; } } |
public class SportsCar extends Car { // Car를 상속받는다.
public boolean turbo; // 1개의 필드를 추가
public void setTurbo(boolean newValue) { //1개의 메소드를 추가 turbo = newValue; //터보 모드 설정 메소드 }
} |
public class CarTest { public static void main(String[] args) { SportsCar scar = new SportsCar(); //수퍼클래스 필드 접급 scar.color = "RED"; scar.setGear(3); //수퍼클래스 메소드 접근 scar.speedUp(200); scar.setTurbo(true); //자체 메소드 호출
} } |
상속이란..
부모클래스로 객체 찍어낸 후, 거기에 이어 붙여서 자식으로 객체 찍어내서 붙여서 하나의 객체를 만들어 내는 것.
class Parent{ int data = 100; public void print(){ System.out.println("부모임"); } } class Child extends Parent{ int data = 200; public void print(){ //메소드 재정의 int data = 300; super.print(); System.out.println("자식임"); System.out.println("data : " + data); System.out.println("this.data : "+ this.data); System.out.println("super.data : "+ super.data); } } public class ParentTest { public static void main(String[] args) { new Child().print(); } } |
|
class Parent{ int data = 100;
public Parent(int data){ System.out.println("Parent의 기본생성자"); this.data = data; } class Parent{ public void print(){ System.out.println("부모임"); } } class Child extends Parent{ int data = 200;
public Child(){ super(200); //부모클래스에 기본생성자가 없다면. // 자식 생성자에 숨어있는 super()가 //동작X, 명시적으로 매개변수 맞춰서 //부모 생성자를 호출해줘야됨. |
부모클래스의 private는 접근불가 // protected는 외부에서는 접근불가, 같은패키지와 자식클래스는 접근가능
public class Employee { public String name; private int RRN; protected int salary;
protected int getSalary(){ return salary; } protected void setSalary(int salary){ this.salary = salary; } } |
public class Manager extends Employee{ private int bonus;
public int getSalary(){ //메소드의 가시성을 증가시키는 것은 가능. return salary + bonus; //protected 멤버인 salary는 접근가능. } private void setSalary(int salary){ super.salary = salary; //오류! 메소드의 가시성을 줄이면 안된다. } public void serRRN(int rrn){ RRN = rrn; //오류! private는 서브클래스에서 접근불가. } } |
키워드 final을 붙이면 상속이나 재정의(@Override)를 할 수 없다.
객체지향에서의 다향성
전제 : 부모클래스의 참조변수로 자식클래스의 객체를 참조할 수 있음(자식클래스의 객체에는 부모클래스로 만든 객체를 포함하닌까)
- 부모클래스의 참조변수로 자식클래스 객체를 참조했을때는 부모클래스의 존재하는 멤버에만 접근가능
- 부모클래스의 참조변수로 자식클래스의 객체를 참조해서 부모클래스에 존재하는 멤버함수 호출 시 자식클래스에서
해당 메소드를 오버라이딩 했다면 실제 호출되는 함수는 자식에서 오버라이딩한 메소드가 호출됨(동적 바인딩)
public class Shape { protected int x,y; public void draw(){ System.out.println("도형을 어떻게 그려 ㅋ"); } } |
|
public class Rectangle extends Shape { private int width, height; public int getWidth() { return width; } public void setWidth(int width) { this.width = width; } public int getHeight() { return height; } public void setHeight(int height) { this.height = height; } @Override public void draw() { System.out.println("사각형을 그립시담."); } } |
public class Triangle extends Shape { private int base, height; public int getBase() { return base; } public void setBase(int base) { this.base = base; } public int getHeight() { return height; } public void setHeight(int height) { this.height = height; } @Override public void draw() { // TODO Auto-generated method stub System.out.println("삼각형을 그립시닷"); } } |
public class Circle extends Shape { private int radius; public int getRadius() { return radius; } public void setRadius(int radius) { this.radius = radius; } @Override public void draw() { System.out.println("원을 그립시당"); } } |
public class ShapeTest { public static void main(String[] args) { // Shape s = new Rectangle(); // //Rectangle이 Shape를 상속받았고 // //Shape가 print()메소드를 정의했으므로 호출가능 // s.print(); // // //Rectangle에는 setWidth(int) 메소드가 존재하지만 // //부모클래스 참조변수로 참조했을때는 Shape에도 존재하는 멤버만 접근가능 // s.setWidth(); // // //draw는 Shape가 정의했으므로 접근 가능하고 // //Rectangle이 오버라이딩 했으므모 실제 실행되는 함수는 Rectangle의 draw(동적바인딩) // s.draw();
Shape[] shape = new Shape[3]; shape[0] = new Rectangle(); shape[1] = new Circle(); shape[2] = new Triangle();
for(int i = 0; i< shape.length; i++ ) shape[i].draw(); } } |
Day15 전략패턴 (0) | 2016.04.01 |
---|---|
Day 14 형변환 , 추상클래스 (0) | 2016.03.31 |
Day12 변수 (0) | 2016.03.29 |
Day11 (0) | 2016.03.28 |
Day10 public/private (0) | 2016.03.25 |