작성자 : 근육베이비
작성자 : 근육베이비
' IOT 기반 응용 SW과정 > Group Studying' 카테고리의 다른 글
5. 쓰레드 (0) | 2016.06.17 |
---|---|
은행 관리 프로그램 (0) | 2016.06.14 |
4. 기본 API (0) | 2016.06.09 |
2. 클래스 (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 |
2. 클래스 (0) | 2016.06.09 |
1. Java의 특징, 변수와 타입, 연산자 (0) | 2016.06.09 |
템플릿 메소드 패턴
//부모클래스에서 템플릿에 해당하는 메소드(fight)가 정의되있고 fight 내용중 세부 attack,move하는 기능에 대한 정의는 추상메소드로 남겨둔채
//자식클래스에서 세부 attack,move를 구현해서 템플릿을 완성하는 방법
package d02;
public abstract class Robot {
protected String name;
public void fight(){
System.out.println(name + "가 전투를 시작합니다.");
attack();
move();
attack();
System.out.println(name + "가 전투를 종료합니다.");
}
public abstract void attack();
public abstract void move();
}
---------------------------------------------------------------
package d02;
public class TaekwonV extends Robot{
// String name = "태권브이";
public TaekwonV(){
name = "태권브이";
}
public void attack(){
System.out.println("펀치로 공격!");
}
public void move(){
System.out.println("날아서 이동!");
}
전체 윤곽인 구조(템플릿)에 대한 재사용은 잘 이뤄지지만, 세부구형기능에 대한 재사용은 이뤄지지 않음.
기능을 재사용하려면, 일단 기능을 분리해야됨. <-- 기능을 구현하는 독립적인 클래스로 구현.
단일 책임 원칙 : 모든 클래스는 하나의 책임만 가지며, 클래스는 그 책임을 완전히 캡슐화해야 함을 일컫는다. 클래스가 제공하는 모든 기능은 이 책임과 주의 깊게 부합해야 한다.
단일 책임 원칙의 장점 - 단일 책임 원칙을 지키려고 하다 보면 인터페이스 등을 도입하게 되며, 여러 디자인 패턴을 적용해서 설계를 우아하게 만들게 된다. 그러면서 자연스럽게 모듈간의 결합이 느슨해진다. 이것은 어떤 변경이 필요할 때 수정 대상을 명확하게 하는 결과를 가져온다.
의존 관계 역전 원칙 : 소프트웨어 모듈들을 분리하는 특정 형식을 지칭한다. 이 원칙을 따르면, 상위 계층(정책 결정)이 하위 계층(세부 사항)에 의존하는 전통적인 의존 관계를 반전(역전)시킴으로써 상위 계층이 하위 계층의 구현으로부터 독립되게 할 수 있다.
리스코프 치환 원칙 : 컴퓨터 프로그램에서 자료형 가 자료형
의 하위형이라면 필요한 프로그램의 속성(정확성, 수행하는 업무 등)의 변경 없이 자료형
의 객체를 자료형
의 객체로 교체(치환)할 수 있어야 한다는 원칙이다.
Day17 제네릭과 컬렉션 (0) | 2016.04.05 |
---|---|
Day16 패키지 (0) | 2016.04.04 |
Day 14 형변환 , 추상클래스 (0) | 2016.03.31 |
Day13 상속 (0) | 2016.03.30 |
Day12 변수 (0) | 2016.03.29 |
절차지향
↓
객체지향
(변수 + 함수 / 상속 / 다형성, 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 |