'프로그래밍'에 해당되는 글 363건

  1. 2012.07.28 5개의 로또번호 출력하기 - collection실습
  2. 2012.07.28 컬렉션(collection)
  3. 2012.07.28 인터페이스(interface)
  4. 2012.07.28 추상화(abstract)
  5. 2012.07.28 다형성 - 실습
  6. 2012.07.28 다형성(polymorephism)
  7. 2012.07.28 의존관계(dependency)
  8. 2012.07.28 final변수
  9. 2012.07.28 this, super키워드
  10. 2012.07.28 상속, 생성자

* 5개의 로또번호 출력하기
ex :

package collection;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.TreeSet;

public class Lotto {

 public static void main(String[] args) {
  //1~45의 숫자중 중복하지 않는 숫자 6개를 만들어 출력하시오.
  //[5,23,1,8,9,14]
  //랜덤한 숫자
  //숫자 - 6개
  //중복되지 않는 숫자를 어떻게 모을 것인가.
  
  ArrayList arrList = new ArrayList();
  //TreeSet lotto=null;

  for(int i =0;i<5;i++){
   TreeSet  lotto = new TreeSet();
   while(true){
    
    lotto.add((int)(Math.random()*45+1));

    if(lotto.size()==6){
  
     break;
    }
   }
  arrList.add(lotto);
  }
  System.out.println("로또 예상 : ");
  System.out.println(arrList);
  
  System.out.println("로또 예상 : ");
  for(int i=0;i<arrList.size();i++){
   System.out.println(arrList.get(i));
  }
  System.out.println("-----------향상된 for문----------");
  for(Object obj : arrList){
   //TreeSet ts = (TreeSet)obj;
   //System.out.println(ts);
   System.out.println(obj.toString());
   
  }

 }

}

'프로그래밍 > JAVA프로그래밍' 카테고리의 다른 글

map실습  (0) 2012.07.28
ArrayList실습  (0) 2012.07.28
컬렉션(collection)  (0) 2012.07.28
인터페이스(interface)  (0) 2012.07.28
추상화(abstract)  (0) 2012.07.28
Posted by 조은성
,

*collection

* 배열은 크기가 한번 정해지면 바뀌지 않는다.
- Collection은 데이터를 계속 집어 넣을 수 있다. (Collection은 자체적으로 데이터를 계속 넣어준다. )
추가 :  add(Object) : boolean (추가가 성공하면 return true, 실패하면 return false)
삭제 :  remove(Object) : boolean (삭제가 성공하면 return true, 실패하면 return false)
조회 : X -> iterator() : Iterator
크기 : size() : int ->관리하는 객체의 수
확인 : contains(Object) : boolean -> 인수로 받은 객체가 collection 안에 있는지 조회.
삭제 : clear() -> 컬렉션 내의 모든 객체 삭체

- Collection<<interface>> -> 값만 모음 - Set : 중복허용(X)
                                               순서(X)

- ~Set - HashSet - 그냥 모으는것.
        TreeSet - 정렬이 필요한 것.


           - List : 중복허용(O)(ex : 똑같은 것을 담을 수 있다.)
       순서(O)(ex : 칸막이가있다.index번호가 생김.배열과 비슷)


 
- ~List - Vector
        - ArrayList(List 중 가장 많이 쓰임) : 전체조회시 좋음.
 - LinkedList : data를 삽입, 삭제시 좋음.

List :  - 추가 :  add(int idx, Object) - 삽입(데이터를 데이터 중간에 넣어주는 것.중간에 값을 넣어주고 데이터가 하나씩 밀려난다.)
            ->idx = 객체를 삽입할 index
        - List는 중간 idx에 null이 있으면 에러가 난다.
 - 수정 : set(int idx, Object) - 교체
 - 구문 : list.Set(2,a);
 - 삭제 : remove(int 삭제할 idx) : Object
  ->특정 idx의 객체를 삭제하고 그 객체를 return
 - 조회 : get(int idx) : Object
         ->특정 index의 객체를 return ->조회
 - indexOf(Object) :  int
  ->인수로 받은 객체의 index(중복된 idx의 0번 idx부터 찾음)를 알려준다.
 - lastIndexOf(Object) : int
  ->인수로 받은 객체의 index(중복된 idx의 마지막 idx)를 알려준다. (ps. 대신 중간에 있는 것은 찾을 수 없다.)

* List ->list -> ArrayList의 객체.

배열 0 ~ length 
for(int i=0;i<list.size();i++){
 Object o = list.get(i);
}

//향상된 for문)
for(Object o : list){
 s.o.p(o);
}


- Map<<interface>> -> 키->값을 쌍으로 모음.  key - value

 

* HashSet ex :

project : day19
package : collection.set
class : SetTest

package collection.set;

import java.util.HashSet;
import java.util.TreeSet;

public class SetTest {
 public static void main(String[] args) {

  // Set - Collection 계열(값만 저장) - 순서 : X, 중복허용 : X
  // HashSet, TreeSet(정렬기능)
  HashSet set = new HashSet();
  // 추가
  set.add("홍길동");
  set.add("이순신");
  set.add("유재석");
  set.add("박명수");
  System.out.println(set);// [객체.toString(), 객체.toString()]
  // 출력 [박명수, 이순신, 홍길동, 유재석] // 이걸 보면 순서가 없다는 것을 알 수 있다.
  boolean flag = set.add("이순신");
  System.out.println(flag + " : " + set);// 중복허용이 안되서 false가 들어가고, 값이 안들어가
            // 있는 것을 볼 수 있다.
  System.out.println("총 객체의 수 : " + set.size()); // 삭제전 총 객체의 수
  // 삭제
  flag = set.remove("박명수");
  System.out.println("박명수 삭제 여부 - " + flag + " : " + set);
  System.out.println("총 객체의 수 : " + set.size());// 삭제 후 총 객체의 수

  System.out.println("------------TreeSet------------");
  TreeSet tSet = new TreeSet(); // 출력 : [길성준, 노홍철, 박명수, 유재석, 정준하, 정형돈, 하하]
          // 내부적으로 ㄱ,ㄴ,ㄷ,ㄹ식으로 정렬되어 나온다.
  tSet.add("유재석");// 정렬기능이 필요할 때 쓴다.
  tSet.add("박명수");
  tSet.add("노홍철");
  tSet.add("정형돈");
  tSet.add("길성준");
  tSet.add("정준하");
  tSet.add("하하");
  System.out.println(tSet);
  flag = tSet.contains("정형돈");// tSet에 정형돈 값을 가지는 String 객체가 있는지를 조회
  System.out.println("정형돈 객체 유무 : " + flag);// 정형돈이 tSet에 들어가 있어서 true가
             // 출력된다.

  // 향상된 for를 이용해 전체 데이터(객체)들 조회 - jdk1.5이상 사용가능.
  for (Object o : tSet) {
   System.out.println(o);
  }

  flag = tSet.isEmpty();// 컬렉션의 size()가 0이면 true
  System.out.println(flag);// tSet에 데이터가 들어가 있으므로 false가 출력
  if (!flag) {// tSet이 비어 있지 않으면
   tSet.clear();
  }
  System.out.println("clear() 후 : " + tSet+", tSet.size() : "+tSet.size()); //컬렉션 내 모든 객체를 remove
  tSet.add(1);//TreeSet의 경우는 같은 데이터만 들어가고 HashSet은 다른 타입도 들어간다.
  tSet.add(2);//기본타입데이터(프리미티브 타입)를 추가 하는 것은 jdk1.5 이상에서만 가능
  tSet.add(3);
  tSet.add(4);
 // tSet.add("abcde");
 // tSet.add(true);
  tSet.add(new Integer(5));//jdk 1.4이하에서의 추가 방법
  System.out.println(tSet);

 }

}

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

=====================================================================
project :  day19
package : collection
class : Lotto


package collection;

import java.util.HashSet;
import java.util.TreeSet;

public class Lotto {

 public static void main(String[] args) {
  //1~45의 숫자중 중복하지 않는 숫자 6개를 만들어 출력하시오.
  //[5,23,1,8,9,14]
  //랜덤한 숫자
  //숫자 - 6개
  //중복되지 않는 숫자를 어떻게 모을 것인가.
  TreeSet ts = new TreeSet();
  int cnt = 0;
  
  //while로 하는 방법
  while(true){
   ts.add((int)(Math.random()*45+1));
   //System.out.println(hs.size());
   cnt++;
   if(ts.size()==6){
    break;
   }
  }
  System.out.println("반복 횟수 : "+cnt);
  System.out.println("로또 예상 : "+ts);
  
  ts.clear();
  cnt=0;
  while(ts.size()<6){
   cnt++;
   ts.add((int)(Math.random()*45+1));
  }
  System.out.println("반복 횟수 : "+cnt);
  System.out.println("로또 예상 : "+ts);
  
  //for로 하는 방법
//  for(;ts.size()<6;){
//   ts.add((int)(Math.random()*45+1));
//  }
//  System.out.println(ts);


 }

}

* project : day19
package : collection.list
class : ArrayListTest

 

package collection.list;

import java.util.ArrayList;

public class ArrayListTest {
 public static void main(String[] args) {
  arraylistBasic();
 }
 public static void arraylistBasic(){
  ArrayList list = new ArrayList(); //배열에 몇개 들어갈지 모르겠다 하면 이렇게 선언하고 딱 몇개 들어갈지 알면 아래와 같이 생성하는게 좋다. 수행시간이 짧아진다.
  //ArrayList list = new ArrayList(10);//초기 length(저장할 수 있는 크기)
  //추가
  list.add("유재석");
  list.add("박명수");
  list.add("정준하");
  list.add("노홍철");
  System.out.println(list);
  
  //조회 - get(int idx) : Object - index의 시작 : 0
  String str = (String) list.get(0);
  System.out.println(str);
  
  System.out.println("-----전체 조회 패턴-----");
  //전체 조회 패턴
  for(int idx=0;idx<list.size();idx++){
   System.out.println(list.get(idx));
  }
  System.out.println("-----향상된 for문 이용 조회 1.5 이상----------");
  for(Object o : list){
   System.out.println(o);
  }
  
  System.out.println("-----삭제----------");
  boolean flag = list.remove("유재석");
  System.out.println("삭제여부 : "+flag+" - "+list);
  
  Object obj = list.remove(1);
  System.out.println("삭제된 객체 : "+obj);
  System.out.println("삭제여부 : "+flag+" - "+list);
  
 }
}


* project : day19
package : collection.dto
class : PersonDTO


package collection.list;

import java.util.ArrayList;

import collection.dto.PersonDTO;

public class ArrayListTest {
 public static void main(String[] args) {
  // arraylistBasic();
  arraylistDTO();
 }

 public static void arraylistDTO() {
  ArrayList list = new ArrayList();
  PersonDTO pdto = new PersonDTO("id-1", "홍길동", 20, "서울");
  list.add(pdto);

  list.add(new PersonDTO("id-2", "이순신", 30, "인천"));
  list.add(new PersonDTO("id-3", "강감찬", 40, "부산"));
  list.add(new PersonDTO("id-4", "김유신", 50, "천안"));
  for (int idx = 0; idx < list.size(); idx++) {
   Object obj = list.get(idx);
   System.out.println(obj.toString());
  }
  System.out.println("-------이름들만 출력 getName()---------");
  for (int idx = 0; idx < list.size(); idx++) {
   PersonDTO obj = (PersonDTO) list.get(idx);
   System.out.println(obj.getName());
  }
  System.out.println("-------향상된 for문을 이용해 나이만 출력---------");
  for (Object o : list) {
   // PersonDTO pto = (PersonDTO)o;
   // System.out.println(pto.getAge());

   System.out.println(((PersonDTO) o).getAge());

  }
 }

 public static void arraylistBasic() {
  ArrayList list = new ArrayList(); // 배열에 몇개 들어갈지 모르겠다 하면 이렇게 선언하고 딱 몇개
           // 들어갈지 알면 아래와 같이 생성하는게 좋다. 수행시간이
           // 짧아진다.
  // ArrayList list = new ArrayList(10);//초기 length(저장할 수 있는 크기)
  // 추가
  list.add("유재석");
  list.add("박명수");
  list.add("정준하");
  list.add("노홍철");
  System.out.println(list);

  // 조회 - get(int idx) : Object - index의 시작 : 0
  String str = (String) list.get(0);
  System.out.println(str);

  System.out.println("-----전체 조회 패턴-----");
  // 전체 조회 패턴
  for (int idx = 0; idx < list.size(); idx++) {
   System.out.println(list.get(idx));
  }
  System.out.println("-----향상된 for문 이용 조회 1.5 이상----------");
  for (Object o : list) {
   System.out.println(o);
  }

  System.out.println("-----삭제----------");
  boolean flag = list.remove("유재석");
  System.out.println("삭제여부 : " + flag + " - " + list);

  Object obj = list.remove(1);
  System.out.println("삭제된 객체 : " + obj);
  System.out.println("삭제여부 : " + flag + " - " + list);

 }
}

'프로그래밍 > JAVA프로그래밍' 카테고리의 다른 글

ArrayList실습  (0) 2012.07.28
5개의 로또번호 출력하기 - collection실습  (0) 2012.07.28
인터페이스(interface)  (0) 2012.07.28
추상화(abstract)  (0) 2012.07.28
다형성 - 실습  (0) 2012.07.28
Posted by 조은성
,

* interface

* abstract는 class가 가진 것 모두 가질수 있다.
* 인터페이스는 컴파일 시점에 오로지 부모 타입의 역할만 하지만 abstract는 메소드도 만들어 사용도 가능하다.
* interface(기본적으로 abstract와 같으나 부모의 역할만 하고 type의 역할만하고 객체를 생성할수는 없으나(abstract), interface는 추상메소드와 static final 변수만 가질 수 있다. 생성자도 없고, 구현된 메소드없고 타입 역할만 하는 것이다. )
- interface : 완벽히 추상화된 구조.
- 역할 :  상위 Type으로서의 역할 - 자식(하위)클래스에 대한 type과 template을 위한 구조.
- 구문 : [접근제한자] interface 이름[extends 인터페이스,...] <- 인터페이스만 상속받을 수 있고, 인터페이스 끼리는 다중 상속이 된다.
 {
  구현 :  [ public static final ] 변수 = 값;   //[]안에 내용은 생략가능 자동으로 컴파일러가 넣어준다. 무조건 있어야 하므로
   [ public abstract ] 메소드 선언;
 }

-> 접근제한자에는 : publc과 package friendly만 올 수 있다. (인터페이스는 누구든 접근 가능해야 하므로 대부분 public 을 쓴다.)


* interface

- class에서 interface 상속 - 다중상속 가능
  - 구문
    [제한자] class 이름 extends class명 implements interface명, interface명, ....
    {

    }

    public class A extends B implements interfaceA, interfaceB, interfaceC{

    }

* uml

B            <<interface>>          <<interface>>
             interfaceA             interfaceB
^
|                 ^                     ^
                  |                     |
A----------------------------------------

* 기본적으로 자바에서 단일 상속을 지원하는 이유
  A            B
----          ----
go()          go()
 ^             ^
 |             |
 |--------------
        C
       ----
       go()

* interface는 상위 클래스에는 추상화 된 구문만 받아오므로 아래 C에서 go()를 불러도 오버라이딩 된 C의 메소드가 불릴 것이기 때문에 다중 상속이 가능하다.


C                                      A<<interface>>
--------                              ---------------
+void go(){}      ----------------->   void go();
+void come(){}
                                          |
                                          |
                                          V
                                      B<<interface>>
                                      ----------------
                                      +void come();

* class에서 interface 상속 - 다중상속가능
class ->(가 class를 상속할때) class : extends, 단일 상속
interface -> interface : extends, 다중상속
class -> interface : implements, 다중상속

- 역할 : 상위 type - 하위 class가 정의할 메소드 선언(추상)(반드시 오버라이딩하게 만들어 둠)
                   - 다형성에서 하위 객체를 대입할 변수의 type

- public static final 변수 = 값; (여러 곳에서 사용할 수 있는 코드값, 불변의 값을 만들때 사용)
- program의 다른 class들에서 사용할 상수값 선언->코드값, 불변의 값

- 크게 관계 없는 class들을 하나의 type으로 묶을 때 사용.
ex :                                                                       수퍼히어로
                이동수단                 Flyer                               ^                                                 
                                           ^                                  |
                    ^                      |                --------------------------------------
                    |                      |----------------|                 |                  |
-------------------------------------------                슈퍼맨        스파이더맨        배트맨
|                   |                     |               
자동차              배               비행기           

 

* 공통적인 동작을 뽑아서 만든 인터페이스에는 Able을 뒤에 붙인다. (ex : FlyerAble)

*
project : day18
package : interfacetest
class : InterfaceTest
interface : InterfaceA
interface : InterfaceB <- InterfaceA를 상속
interface : interfaceC


package interfacetest;

public class InterfaceTest {
 public static void main(String[] args) {
  SubClass1 s1 = new SubClass1();
  InterfaceA s2 = new SubClass1();
  InterfaceB s3 = new SubClass1();
  
  s2.methodA();
  //s2.methodB();
  s3.methodA();
  s3.methodB();

 }

}


--------

package interfacetest;

public interface InterfaceA {
 public static final int CONST_A = 10;
 //int CONST_A = 10;//public static final을 생략하면 컴파일러가 자동으로 만들어 준다. 위 아래 두개가 같은식이다.
 public abstract void methodA();
 //void methodA(); //public abstract를 생략하면 컴파일러가 자동으로 만들어 준다. 위 아래 두개가 같은식이다.(컴파일러가 자동 생성해 주는 이유는 무조건 필요하기 때문이다.
 
}

---------
package interfacetest;

public interface InterfaceB extends InterfaceA {
 public abstract void methodB();
}

------
package interfacetest;

public interface InterfaceC {
 public abstract void methodC();
}


-----
package interfacetest;


public class SubClass1 implements InterfaceB {

 @Override
 public void methodA() {
  System.out.println("SubClass1.methodA()");

 }

 @Override
 public void methodB() {

  System.out.println("SubClass1.methodB()");

 }

}


--------
================================================================================================

* interface는 class가 아니고 타입의 역할만 하는 거다. 객체화 되지 않는다.
* 추상화class는 class 되고 객체화 되고, 타입의 역할도 한다.

package interfacetest;

public class InterfaceTest {
 public static void main(String[] args) {
  SubClass1 s1 = new SubClass1();
  InterfaceA s2 = new SubClass1();
  InterfaceB s3 = new SubClass1();
  
  s2.methodA();
  //s2.methodB();  //InterfaceB에 선언된 메소드 이므로 컴파일 에러
  s3.methodA();
  s3.methodB();
  SubClass2 su1 = new SubClass2();
  InterfaceA su2  = new SubClass2();
  InterfaceB su3 = new SubClass2();
  InterfaceC su4 = new SubClass2();
  
 }

}


---------

package interfacetest;


public class SubClass1 implements InterfaceB {

 @Override
 public void methodA() {
  System.out.println("SubClass1.methodA()");

 }

 @Override
 public void methodB() {

  System.out.println("SubClass1.methodB()");

 }

}


--------

package interfacetest;


public class SubClass2 implements InterfaceB, InterfaceC {

 @Override
 public void methodA() {
  // TODO Auto-generated method stub
  
 }

 @Override
 public void methodC() {
  // TODO Auto-generated method stub
  
 }

 @Override
 public void methodB() {
  // TODO Auto-generated method stub
  
 }
 
}

--------

package interfacetest;

public interface InterfaceA {
 public static final int CONST_A = 10;
 //int CONST_A = 10;//public static final을 생략하면 컴파일러가 자동으로 만들어 준다. 위 아래 두개가 같은식이다.
 public abstract void methodA();
 //void methodA(); //public abstract를 생략하면 컴파일러가 자동으로 만들어 준다. 위 아래 두개가 같은식이다.(컴파일러가 자동 생성해 주는 이유는 무조건 필요하기 때문이다.
 
}

-------

package interfacetest;

public interface InterfaceB extends InterfaceA {
 public abstract void methodB();
}

--------

package interfacetest;

public interface InterfaceC {
 public abstract void methodC();
}

'프로그래밍 > JAVA프로그래밍' 카테고리의 다른 글

5개의 로또번호 출력하기 - collection실습  (0) 2012.07.28
컬렉션(collection)  (0) 2012.07.28
추상화(abstract)  (0) 2012.07.28
다형성 - 실습  (0) 2012.07.28
다형성(polymorephism)  (0) 2012.07.28
Posted by 조은성
,

* 추상화(모든 자식class들이 동일하게 하는 것들을 모아서 부모class에 추상화 시켜 놓는 것)
- 추상메소드 :  자식클래스들이 부모클래스의 메소드를 오버라이딩 해서 사용하게 하려고 만듬.
Animal
------
eat()     <- 추상메소드


Dog       Cat        Lion
----      ----       -----
eat()     eat()      eat()

* abstact - instance 메소드, class에 사용되는 제한자
          - 의미 :  추상적이다->구현이 안되었다.
- 메소드 :  메소드 구현없이 선언만한 메소드
예) public abstact void go(); ->{}붙으면 안됨.
->하위 class에서의 overriding 을 강제한다.
->하위class들이 구현할 메소드의 template(틀)역할.


- class -> 객체생성을 못하는 class
예 ) public abstact class Animal{구현}

-abstract 메소드를 가지는 class는 반드시 abstract class가 되야한다.
-부모 class에 정의된 abstract메소드를 overriding 안하면 abstract class가 되야한다.
-abstract class는 구현된 일반메소드도 가질수 있따.

- > 역할 :  자식 class의 template, 자식 객체에 대한 type 역할 - 다형성

 

* abstract class - 일반class
                   field
                   생성자
                   메소드
                   추상메소드
                  

*
project : day18
package : abstr.test
class : AbstractTest

package abstr.test;

abstract class Super{
 int num;

 public Super() {}

 public Super(int num) {
  this.num = num;
 }
 public abstract void methodA();
 public void templateMethod(){
  System.out.println("하위클래스의 구현이 모두 같은 메소드 : "+num);
 }
}
class Sub extends Super{
 public Sub(){}
 public Sub(int num){
  super(num);
 }
 
 public void methodA(){
  System.out.println("Sub.methodA()");
 }
}
public class AbstractTest {
 public static void main(String[] args) {
  //Super s = new Super(); //추상클래스는 객체 생성을 할 수 없다.
  Sub sub = new Sub();
  sub.methodA();
  Sub sub2 = new Sub(100);
  sub2.templateMethod();
 }
}

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

project : day18
package : abstr.animal
class : PolymorphicArgsTest


package abstr.animal;

public class PolymorphicArgsTest {
 public void raise(Animal an){
  an.eat();
  an.sleep();
  
 }
 public static void main(String[] args) {
  Dog d = new Dog();
  Lion l = new Lion();
  
  d.eat();
  d.sleep();
  
  System.out.println("------------------------");
  
  PolymorphicArgsTest pt = new PolymorphicArgsTest();
  pt.raise(d);
  pt.raise(l);
 }
}


------


package abstr.animal;

//하위클래스들의 type, 하위클래스들의 틀(Template) -> 추상클래스
public abstract class Animal {
 public abstract void eat();
 public abstract void sleep();

}

---------

package abstr.animal;

public class Lion extends Animal{

 @Override
 public void eat() {
  System.out.println("사자가 먹는다.");
 }

 @Override
 public void sleep() {
   System.out.println("사자가 잔다.");
 }
 
}


------

package abstr.animal;

public class Dog extends Animal{

 @Override
 public void eat() {
  System.out.println("개밥 그릇에 사료를 우그적 먹는다.");
 }

 @Override
 public void sleep() {
  System.out.println("개집에서 잔다.");
 }

 
}

'프로그래밍 > JAVA프로그래밍' 카테고리의 다른 글

컬렉션(collection)  (0) 2012.07.28
인터페이스(interface)  (0) 2012.07.28
다형성 - 실습  (0) 2012.07.28
다형성(polymorephism)  (0) 2012.07.28
의존관계(dependency)  (0) 2012.07.28
Posted by 조은성
,

다형성 연습

UML - word

package : wordprocessorTest
class : WordUser

package : wordprocessor.word
class : Word

package : wordprocessor.format
class : Format
 AstaFormat
 EqulFormat
 SharpFormat


------


package wordprocessorTest;


import wordprocessor.format.AstaFormat;
import wordprocessor.format.Format;
import wordprocessor.format.SharpFormat;
import wordprocessor.word.Word;

public class WordUser {
 public static void main(String[] args) {
  Word word = new Word();
  Format f = new Format();
  AstaFormat af = new AstaFormat();
  SharpFormat sf = new SharpFormat();
  word.print("출력할 내용 :  Hello",f);
  word.print("출력할 내용 :  Hello",af);
  word.print("출력할 내용 :  Hello",sf);
 }
}


----------

package wordprocessor.word;

import wordprocessor.format.Format;
public class Word {
 public void print(String message, Format format){
  System.out.println(format.getFormat(message));
 }
}


----------

package wordprocessor.format;

public class Format {
 public String getFormat(String message){
  String str;
  str = "---------------------\n"+message+"\n---------------------";
  return str;
 }
}


----------

package wordprocessor.format;


public class AstaFormat extends Format{

 @Override
 public String getFormat(String message) {
  // TODO Auto-generated method stub
  return super.getFormat(message).replace('-','*');
 }
 
}


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

package wordprocessor.format;

public class EqulFormat extends Format{

 @Override
 public String getFormat(String message) {
  // TODO Auto-generated method stub
  return super.getFormat(message).replace('-', '=');
 }
 

}


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

package wordprocessor.format;

public class SharpFormat extends Format{

 @Override
 public String getFormat(String message) {
  // TODO Auto-generated method stub
  return super.getFormat(message).replace('-', '#');
 }
 
}


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

=====================================================================================================
       


* 2012-3-16

* 다형성 - 부모tyoe  변수 - 자식객체 (compile시점에 되는 경우는 상속인 경우 부모가 자식보다 더 큰 tyoe이면 다형성이 된다) , 실행시점에서는 부모의 객체와 자식의 객체가 둘다 생성되서 접근가능.
         -> 부모에 정의된 메소드만 호출가능.

- Super s = new Super();
   s.a();(o)자식에 있는 a()를 호출
 s.b();(x)자식에는 b()가 있지만 부모에 없어서 컴파일 시점에서 에러가 난다. 
        

Super              Sub
----- <-------     ------
a()                a()
                   b()

- 배열 Heterogeneous -> reference type의 배열.


* Super = new Super()           c : o
  Sub1 sub = (Sub1)s;           R : x


* Sub1 sub1 = new Sub1();           C : X   (컴파일시점)
  Sub2 sub2 = (Sub2)sub1;           R : X   (실행시점)

* Super s = new Super();            C : O
  Sub1 s1 = (Sub1)s;                R : O

 

'프로그래밍 > JAVA프로그래밍' 카테고리의 다른 글

인터페이스(interface)  (0) 2012.07.28
추상화(abstract)  (0) 2012.07.28
다형성(polymorephism)  (0) 2012.07.28
의존관계(dependency)  (0) 2012.07.28
final변수  (0) 2012.07.28
Posted by 조은성
,

* 다형성(polymorephism) - 부모type의 변수에 자식type의 객체를 대입

int i = 10;
long l = 10; <-작은 type을 큰 타입으로 바꿔주므로 된다. long l = 10L;

byte b = 20;
short s = 5
int i = 30;
long l = b;(o)
long l = s;(o)
long l = i;(o)

- 상속관계일 때는 저렇게 a를 생성하는게 가능하다.
Animal- Dog
      - Cat
      - Human

Animal a = new Animal();(O)
       a = new Cat();
       a = new Dog();


* 컴파일 시점에는 소스코드로 가서 본다 .

Animal
------
eat()       <------
                  |
^                 |
|                 |
Dog               Cat
----              ----
eat()             eat()
cry()             cry()


Animal c = new Cat(); ok
c.eat();  ok   //Animal class에 eat()가 있어서 되지만
c.cry();  no   //Animal class에 cry()를 찾는데 없어서 컴파일 시점에 실행되지 않는다.

이렇게 바꾸면 된다.
Animal a = new Cat();
Cat c = (Cat)a;
c.cry();


* class 변수  = new 생성자()
  변수, 메소드()

compile ->type
실행 -> 객체(값)

Animal a = new Cat();
a.eat();

eat() - compie시점 : Animal
        실행시점 :  Cat

다형성 : 부모에 선언된 메소드만 호출가능.
         자식에 선언된 메소드 사용하려면 형변환 필요.

 

Animal a = new Cat();
a.eat() - c : Animal
        - R : Cat

a.cry() - C : Animal - compile 에러

따라서

Cat c - (Cat) a ;
c.cry() - C : Cat
          R : Cat

* 다형성은 거의 배열에 정의한다.  (다형성의 개념은 중요하지만 우리가 직접 사용하지는 않는다. 쓸것은 이미 class에 다 정의 되어 있다. )

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

project :  day17
package : polymorphism.dto
class : Animal, Dog, Cat

project :  day17
package : polymorphism.test
class : PolymorphismTest


package polymorphism.test;

import polymorphism.dto.Animal;
import polymorphism.dto.Cat;
import polymorphism.dto.Dog;

public class PolymorphismTest {


 public static void main(String[] args) {
  //다형성을 이용해 객체 생성
  //부모 타입 변수 = 자식 타입 객체
  Animal an1 = new Dog();
  Animal an2 = new Cat();
  //모든 클래스의 최상위 -> Object
  Object obj1 = new Animal();
  Object obj2 = new Cat();
  Object obj3 = new Dog();
  
  //이런것도 Polymorphism(다형성)이다.
  Cat c = new Cat();
  Animal an3 = c;
  
  an1.eat();
  an1.sleep();
  an2.eat();
  an2.sleep();
  
  //부모타입변수, 자식의 메소드()          an2.cry();가 Animal type이라 Animal 가도 없으니 Cat type으로 형변환 시켜줘야한다.
  //an2.cry();
  
  //((Cat) an2).cry();
  Cat c2 = (Cat)an2;
  c2.cry();
 }

}

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

package polymorphism.dto;

public class Animal {
 public void eat(){
  System.out.println("동물이 먹는다. ");
 }
 public void sleep(){
  System.out.println("동물이 잔다.");
 }

}


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

package polymorphism.dto;

public class Cat extends Animal {

 @Override
 public void eat() {
  System.out.println("고양이가 고양이 밥을 먹는다.");
 }

 @Override
 public void sleep() {
  System.out.println("고양이가 잔다.");
 }
 public void cry(){
  System.out.println("고양이가 운다..야옹.....");
 }
}


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

package polymorphism.dto;

public class Dog extends Animal{

 @Override
 public void eat() {
  System.out.println("개밥 그릇에 사료를 우그적 먹는다.");
 }

 @Override
 public void sleep() {
  System.out.println("개집에서 잔다.");
 }

 
}

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

* Heterogemeous Collection - 다른 type의 Data를 모으는 배열(객체)!
                           - 배열에 다형성이 적용된 것.
////////////
//객체데이터 모음을 관리 할 수 있다.
for( Animal a : anArr){
 a.eat();
}

/////////////////

long[] l = new long[5];
l[0]=10;
l[1]=20L;
//이렇게 보면 int도 들어가고 long도 들어간다.

Animal[] anArr = new Animal[5];
anArr : Animal[]
anArr[0] : Animal

anArr[0] = new Animal();
anArr[1] = new Dog();
anArr[2] = new Cat();

* 부모 type의 배열에 자식 type 객체들을 할당(대입)

* 자바에서 존재하는 type은 1. 프리미티브 2. 레퍼런스 두개가 있다.


project :  day17
package :  polymorphism.test
class : HeterogemeousTest

package polymorphism.test;

import polymorphism.dto.Animal;
import polymorphism.dto.Cat;
import polymorphism.dto.Dog;

public class HeterogemeousTest {
 public static void main(String[] args) {
  //배열에 다형성을 적용 - 부모 type배열에 자식 타입의 객체를 넣는것.
  Animal[] an1 = new Animal[3];
  Animal[] an2 = new Cat[4];
  
  an1[0] = new Animal();
  an1[1] = new Cat();
  an1[2] = new Dog();
  
  Animal[] an3 = {new Animal(), new Dog(), new Cat()};
  for( int i = 0; i< an1.length;i++){
   an1[i].eat();
  }
  
  System.out.println("============향상된 for문==============");
  //for(변수선언 :  배열)
  for(Animal an : an3){
   if(an instanceof Cat){
   Cat c = (Cat)an;
   c.cry();
   }
   an.sleep();
  }
  boolean b = an3[0] instanceof Cat;
  String str ="abc";
  //b = str instanceof Dog; //둘이 상속이 아니라서 에러가 난다. instanceof는 상속관계에서 사용한다. if문에서 주로 객체비교 시사용
 }
}

 


*instanceof
비교할 객체 instanceof Type :  boolean

a instanceof B -> a가 참조하는 객체가 B type 인지 검사해서 맞으면 true return

boolean "abc" instanceof A; //에러난다. a와 B의 type이 상속관계에 있어야 한다.(서로 완전히 다른 객체면 비교할 필요가 없기 때문이다.)

- a의 type이 B의 상쉬 type일 때만 비교할 수 있다.


* class 는 Datatype로 사용하지만
class 가 Datatype은 아니다.

Animal an = new Animal(); //an에는 Animal, Dog, Cat 다 들어갈 수 있다.


* Polymorphic Argument -> 매개변수에 다형성이 적용된 것이다.

Animal - Cat
      <- Dog
       - Snake

void go( Cat c){
c.eat();
}

void go(Dog d){
d.eat();
}

void go(Snake s){
s.eat();
}

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

위에 go()메소드를
void go(Animal a){
a.eat();
}
을로 바꿔주면 세개의 메소드를 한개만 만들면 된다. 대신 호출 시 go(d)나 go(c)나 go(s)로 해야한다.

 

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

project : day17
package : polymorphism.test
class : Zookeeper(사육사), PolymeorphicArgsTest

project : day17
package : polymorphism.dto
class : Lion


package polymorphism.test;

import polymorphism.dto.Cat;
import polymorphism.dto.Dog;
import polymorphism.dto.Lion;

public class PolymeorphicArgsTest {
 public static void main(String[] args) {
  //사육사 객체를 생성
  ZooKeeper zk = new ZooKeeper();
  Dog d = new Dog();
  Cat c = new Cat();
  Lion l = new Lion();
  
  zk.raise(d);
  zk.raise(c);
  zk.raise(l);
 }
}


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

package polymorphism.test;

import polymorphism.dto.Animal;

public class ZooKeeper {
 /*
  * 우리 청소
  * 밥 먹이기
  * 잠 재우기
  */
 public void raise(Animal a){
  System.out.println("--------------------");
  System.out.println("우리를 청소한다.");
  a.eat();
  a.sleep();
 
 }
}


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


package polymorphism.dto;

public class Lion extends Animal{

 @Override
 public void eat() {
  System.out.println("사자가 먹는다.");
 }

 @Override
 public void sleep() {
   System.out.println("사자가 잔다.");
 }
 
}
--------------------------

package polymorphism.dto;

public class Dog extends Animal{

 @Override
 public void eat() {
  System.out.println("개밥 그릇에 사료를 우그적 먹는다.");
 }

 @Override
 public void sleep() {
  System.out.println("개집에서 잔다.");
 }

 
}


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

package polymorphism.dto;

public class Cat extends Animal {

 @Override
 public void eat() {
  System.out.println("고양이가 고양이 밥을 먹는다.");
 }

 @Override
 public void sleep() {
  System.out.println("고양이가 잔다.");
 }
 public void cry(){
  System.out.println("고양이가 운다..야옹.....");
 }
}

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

package polymorphism.dto;

public class Animal {
 public void eat(){
  System.out.println("동물이 먹는다. ");
 }
 public void sleep(){
  System.out.println("동물이 잔다.");
 }

}


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

============================================================================

package polymorphism.test;

import polymorphism.dto.Cat;
import polymorphism.dto.Dog;
import polymorphism.dto.Lion;
import polymorphism.dto.Tiger;

public class PolymeorphicArgsTest {
 public static void main(String[] args) {
  //사육사 객체를 생성
  ZooKeeper zk = new ZooKeeper();
  Dog d = new Dog();
  Cat c = new Cat();
  Lion l = new Lion();
  Tiger t = new Tiger();
  
  
  zk.raise(d);
  zk.raise(c);
  zk.raise(l);
  zk.raise(t);
 }
}


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

 

package polymorphism.test;

import polymorphism.dto.Animal;
import polymorphism.dto.Tiger;

public class ZooKeeper {
 /*
  * 우리 청소
  * 밥 먹이기
  * 잠 재우기
  */
 public void raise(Animal a){
  System.out.println("--------------------");
  System.out.println("우리를 청소한다.");
  if(a instanceof Tiger){
   Tiger t = (Tiger)a;
   t.hunt();
   //((Tiger) a).hunt();
  }
  else{
  a.eat();
  }
  a.sleep();
 
 }
}


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

package polymorphism.dto;

public class Animal {
 public void eat(){
  System.out.println("동물이 먹는다. ");
 }
 public void sleep(){
  System.out.println("동물이 잔다.");
 }

}


package polymorphism.dto;

public class Cat extends Animal {

 @Override
 public void eat() {
  System.out.println("고양이가 고양이 밥을 먹는다.");
 }

 @Override
 public void sleep() {
  System.out.println("고양이가 잔다.");
 }
 public void cry(){
  System.out.println("고양이가 운다..야옹.....");
 }
}


package polymorphism.dto;

public class Dog extends Animal{

 @Override
 public void eat() {
  System.out.println("개밥 그릇에 사료를 우그적 먹는다.");
 }

 @Override
 public void sleep() {
  System.out.println("개집에서 잔다.");
 }

 
}


package polymorphism.dto;

public class Lion extends Animal{

 @Override
 public void eat() {
  System.out.println("사자가 먹는다.");
 }

 @Override
 public void sleep() {
   System.out.println("사자가 잔다.");
 }
 
}


package polymorphism.dto;

public class Tiger extends Animal{

 @Override
 public void eat() {
  System.out.println("호랑이가 먹는다.");
  }

 @Override
 public void sleep() {
  System.out.println("호랑이가 잔다.");
 }
 public void hunt(){
  System.out.println("호랑이가 사냥해서 먹는다.");
 }

 
}

'프로그래밍 > JAVA프로그래밍' 카테고리의 다른 글

추상화(abstract)  (0) 2012.07.28
다형성 - 실습  (0) 2012.07.28
의존관계(dependency)  (0) 2012.07.28
final변수  (0) 2012.07.28
this, super키워드  (0) 2012.07.28
Posted by 조은성
,

* 의존관계
- has a ->Attribute    ex :  자동차 - 엔진         
                                                     - 타이어
   ->aggregation 부엌 - 냉장고(부엌이 만들어 질때 부품들이 채워져 있지 않고 나중에 조금씩 채운다. (life cycle이 같지 않아도 된다.)
   ->composition - 생성될 때 다 같이 생성되야 한다.(부엌이 만들어 질때 부품들이 채워져 있어야한다.)(life cycle이 같아야 한다.)
        
- use a ->메소드 -사용하고 나면 없어지는것.

 

* has a 관계 ( 의존 관계 )
ex :

package dependency;

public class AddressDTO {
 private String zipCode;
 private String addressDetail;
 public AddressDTO() {
 }

 public AddressDTO(String zipCode, String addressDetail) {
  this.zipCode = zipCode;
  this.addressDetail = addressDetail;
 }
 public String getZipCode() {
  return zipCode;
 }
 public void setZipCode(String zipCode) {
  this.zipCode = zipCode;
 }
 public String getAddressDetail() {
  return addressDetail;
 }
 public void setAddressDetail(String addressDetail) {
  this.addressDetail = addressDetail;
 }
 @Override
 public String toString() {
  return "AddressDTO [zipCode=" + zipCode + ", addressDetail="
    + addressDetail + "]";
 }
 
}


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


package dependency;

public class SchoolDTO {
 private String schoolId;
 private String schoolName;
 private String schoolTelNo;
 private int enrolment;
 private AddressDTO addressTo;
 

 public SchoolDTO() {}
 public SchoolDTO(String schoolId, String schoolName, String schoolTelNo,
   int enrolment, AddressDTO addressTo) {
  this.schoolId = schoolId;
  this.schoolName = schoolName;
  this.schoolTelNo = schoolTelNo;
  this.enrolment = enrolment;
  this.addressTo = addressTo;
 }
 public String getSchoolId() {
  return schoolId;
 }
 public void setSchoolId(String schoolId) {
  this.schoolId = schoolId;
 }
 public String getSchoolName() {
  return schoolName;
 }
 public void setSchoolName(String schoolName) {
  this.schoolName = schoolName;
 }
 public String getSchoolTelNo() {
  return schoolTelNo;
 }
 public void setSchoolTelNo(String schoolTelNo) {
  this.schoolTelNo = schoolTelNo;
 }
 public int getEnrolment() {
  return enrolment;
 }
 public void setEnrolment(int enrolment) {
  this.enrolment = enrolment;
 }
 public AddressDTO getAddressTo() {
  return addressTo;
 }
 public void setAddressTo(AddressDTO addressTo) {
  this.addressTo = addressTo;
 }
 @Override
 public String toString() {
  return "SchoolDTO [schoolId=" + schoolId + ", schoolName=" + schoolName
    + ", schoolTelNo=" + schoolTelNo + ", enrolment=" + enrolment
    + ", addressTo=" + addressTo + "]";
 }
 
}

 

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

 

package dependency;

public class StudentDTO {
 private String studentId;
 private String studentName;
 private int studentAge;
 private int studentGrade;
 private int studentClazz;
 private int studentNumber;
 private SchoolDTO schoolTo;

 public StudentDTO(SchoolDTO schoolTo) {
  this.schoolTo = schoolTo;
 }
 
 public StudentDTO(String studentId, String studentName, SchoolDTO schoolTo) {
  this.studentId = studentId;
  this.studentName = studentName;
  this.schoolTo = schoolTo;
 }

 public StudentDTO(String studentId, String studentName, int studentAge,
   int studentGrade, int studentClazz, int studentNumber,
   SchoolDTO schoolTol) {
  this.studentId = studentId;
  this.studentName = studentName;
  this.studentAge = studentAge;
  this.studentGrade = studentGrade;
  this.studentClazz = studentClazz;
  this.studentNumber = studentNumber;
  this.schoolTo = schoolTol;
 }
 public String getStudentId() {
  return studentId;
 }
 public void setStudentId(String studentId) {
  this.studentId = studentId;
 }
 public String getStudentName() {
  return studentName;
 }
 public void setStudentName(String studentName) {
  this.studentName = studentName;
 }
 public int getStudentAge() {
  return studentAge;
 }
 public void setStudentAge(int studentAge) {
  this.studentAge = studentAge;
 }
 public int getStudentGrade() {
  return studentGrade;
 }
 public void setStudentGrade(int studentGrade) {
  this.studentGrade = studentGrade;
 }
 public int getStudentClazz() {
  return studentClazz;
 }
 public void setStudentClazz(int studentClazz) {
  this.studentClazz = studentClazz;
 }
 public int getStudentNumber() {
  return studentNumber;
 }
 public void setStudentNumber(int studentNumber) {
  this.studentNumber = studentNumber;
 }
 public SchoolDTO getSchoolTol() {
  return schoolTo;
 }
 public void setSchoolTol(SchoolDTO schoolTol) {
  this.schoolTo = schoolTol;
 }
 @Override
 public String toString() {
  return "StudentDTO [studentId=" + studentId + ", studentName="
    + studentName + ", studentAge=" + studentAge
    + ", studentGrade=" + studentGrade + ", studentClazz="
    + studentClazz + ", studentNumber=" + studentNumber
    + ", schoolTo=" + schoolTo + "]";
 }
 
}

'프로그래밍 > JAVA프로그래밍' 카테고리의 다른 글

다형성 - 실습  (0) 2012.07.28
다형성(polymorephism)  (0) 2012.07.28
final변수  (0) 2012.07.28
this, super키워드  (0) 2012.07.28
상속, 생성자  (0) 2012.07.28
Posted by 조은성
,

* final : 변수, 메소드(instance 메소드), class

- 변경이 안된다. (더이상 바꿀 수 없다.)
- 메소드 :  하위 class에서 overriding 할 수 없다.
- class : 하위 class를 가질 수 없는 class.    
(대표 : String class, 선언 -> 한번 값이 대입되면 다시는 대입안됨.
ex :  final int i = 10; i는 프로그램이 끝날때까지 값을 바꿀 수 없고 10만을 갖는다.

변수 :  변수의 상수화-> 한번 값이 대입되면 다시는 대입안됨.
instance변수 : 묵시적 초기화(x)
->값 대입 :  명시적 대입 (명시적 초기화)
->생성자에서 대입

final 변수은 한번 생성해주고 변수를 바꿀 수 없으므로 static과 잘어울린다.

- static 변수 : 선언시 값 대입.
   ->구문 : public static final
class A{
 static final int i =10;
 }

- 지역변수 :  사용 전까지 대입.
public void go(){
 final int i;
 i = 10; (이렇게 사용전에는 대입을 해줘야 하고, 한번 대입되면 값이 바뀔 수 없다. )
 System.out.prinltl(i);
 }

* final변수의 이름 관례 : 대문자
   단어 + 단어 -> 단어_단어

* final class는 상속이 안된다.

project : day16
package : finaltest.clazz
class : SuperClass
    SubClass

package finaltest.clazz;

public final class SuperClass {

}

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

package finaltest.clazz;

public class SubClass extends SuperClass{

}

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

project : day16
package : finaltest.method
class : SuperClass
    SubClass

* final 이 붙은 메소드는 하위 class에서 오버라이드 할 수 없다.

package finaltest.method;

public class SuperClass {
 public final void methodB(){
   System.out.println("안녕하세요");
 }
}
---------------------

package finaltest.method;

public class SubClass extends SuperClass{
 
 @Override
 public void methodB(){
  System.out.println("SubClass 안녕하세요");
}
}

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

project : day16
package : finaltest.var
class : Rectangle

package finaltest.var;

public class Rectangle {
 public static final double PI = 3.14;
 public static final int BLACK = 0;
 public static final int WHITE = 1;
 public static final int BLUE; //여기서 에러가 난다. static final 변수는 선언을 하면서 반드시 값을 대입 해줘야한다.
}
-------------------------------------------

package finaltest.var;

public class Rectangle {
 public static final double PI = 3.14;
 public static final int BLACK = 0;
 public static final int WHITE = 1;
 //public static final int BLUE; //여기서 에러가 난다. static final 변수는 선언을 하면서 반드시 값을 대입 해줘야한다.
 private final int WIDTH;          //final instance변수는 선언시 대입하거나 생성자에서 값을 대입해야한다.  처음 초기화하면 생성자에서 또 다시 값을 넣을 수 없다.
 public Rectangle(int width){
  this.WIDTH = width;
 }

}

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

* 값이 대입되지 않은 로컬 변수는 사용할 수 없다.

package finaltest.var;

public class Rectangle {
 public static final double PI = 3.14;
 public static final int BLACK = 0;
 public static final int WHITE = 1;
 //public static final int BLUE; //여기서 에러가 난다. static final 변수는 선언을 하면서 반드시 값을 대입 해줘야한다.
 private final int WIDTH;
 public Rectangle(int width){
  this.WIDTH = width;
 }
 public void rectMethod(){
  final int var;
  
  //var = 20;
  //var = 10; //단 값은 한번만 넣어야 한다.

  System.out.println(var);
 }
}

'프로그래밍 > JAVA프로그래밍' 카테고리의 다른 글

다형성(polymorephism)  (0) 2012.07.28
의존관계(dependency)  (0) 2012.07.28
this, super키워드  (0) 2012.07.28
상속, 생성자  (0) 2012.07.28
싱글턴 패턴  (0) 2012.07.28
Posted by 조은성
,

* super
1. 부모의 생성자 호출 시 사용(중요함, )
-생성자는 class와 이름이 같아야 하므로 부모class의 생성자는 상속이 안된다.
단, 자식 class의 생성자에서 부모의 생성자 호출은 가능.
- super([argument, ...]);
->생성자 구현부의 첫 명령어로 와야한다. (this도 생성자 구현부의 첫 명령어로 와야함으로 this와 super는 함께 쓸수 없다. )
->생성자 구현부에 this()나 super() 코드가 없으면 super();<-부모의 no-argument 생성자 호출 하는 코드가 자동으로 들어간다.
2. 부모의 객체를 참조하는 변수(중요도가 약간 떨어짐)

* this
1. overloading 된 생성자 호출(몰라도 프로그램 짜는데 이상이 없음, 프로그램 코딩을 다해주면됨. 코드 라인을 줄여주는 역할)
->생성자 구현부의 첫 명령어로 와야한다.
2.현재 일하는 메소드의 객체 - local

* 메소드 overriding(메소드 재정의) :  하위 class에서 부모 class에 정의된 메소드의 구현을 재정의 하는것. (자기만의 특징을 넣어서 다시 구현하고 싶을 때 메소드를 다시 정의하는 것.)
- 규칙 : 부모 안에 있는 메소드를 자식에서 똑같이 만들어서 내용만 바꾸는 것이다.
             전제 :  상속관계
      1. 이름, return type, 매개변수가 같아야 한다.
      2. 접근 제한자의 범위가 부모와 같거나 더 넓어야 한다. (만약 접근제한자의 범위가 부모가 protected면 자식은 protected나 public 이어야 한다.만약 접근제한자의 범위가 부모가 public이면 자식은 public이어야한다.단, 부모가 private면 상속해서 받아 올 수 없기때문에 오버라이딩이 아니다.)
* 메소드 overloading - 다른 메소드인데 인자와 타입이 다르면 한 클레스 내에서 사용 가능한 것.

*exception 관련 규칙.


* 2012-3-14

- 상속 :
부모클래스 :  자식클래스의 공통적인 내용을 추려서 새로 만들어진 클래스
(추상적이다.)

* super - 생성자호출 -> 부모의 생성자를 부름
             - 객체의 참조변수
      - 생성자 구현 첫 명령에 와야 한다.
      - 하위 class의 객체에서 부모 class의 객체를 참조하는 참조변수.
      - overriding한 메소드에서 부모에 정의된 원본메소드 호출시 사용.
      사용 : super.부모의 member-변수나, 메소드

          public
넓다       |
          protected
              |
좁다   private

*
Project : day16
package : overriding.test
class : Superclass
    SubClass

package overriding.test;

public class SuperClass {
 

 public void methodA(int i){
  System.out.println("SuperClass.methodA() : "+i);
 }
}


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


package overriding.test;

public class SubClass extends SuperClass {
 /*
 //overriding - return type이 틀림
 public int methodA(int i){
  System.out.println("SubClass.methodA(int) : "+i);
 }
 //overriding = 접근제한자가 부모보다 좁아서 틀림.
 protected void methodA(int i){
  System.out.println("SubClass.methodA(int) :"+i);
 }
 */
 //overriding = 정상
 public void methodA(int i){
  System.out.println("SubClass.methodA(int) :"+i);
 }
 
 //overloading
 public void methodA(){
  System.out.println("SubClass.methodA()");
 }
 //overloading
 public void methodA(String str){
  System.out.println("SubClass.methodA(String) : "+str);
 }
 public static void main(String[] args) {
  SubClass sc  = new SubClass();
  sc.methodA(10);
 }
}


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

* 도형 예제

package : overriding.figure
TestShape - main()
Rectangle -width, height
Circle - radius, PI
Triangle - width, height

Shape - public void calculate Area(){}


ex :

package overriding.test;

import overriding.figure.Circle;
import overriding.figure.Rectangle;
import overriding.figure.Triangle;

public class TestShape {

 public static void main(String[] args) {
  Circle c = new Circle(3);
  c.calculateArea();
  
  Rectangle r = new Rectangle(10,20);
  r.calculateArea();
  
  Triangle t = new Triangle(10,20);
   t.calculateArea();

 }

}

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

package overriding.figure;

public class Shape {
 public void calculateArea(){}
}

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

package overriding.figure;

public class Rectangle extends Shape{
 private double width;
 private double height;
 
 public Rectangle(double width, double height) {
  this.width = width;
  this.height = height;
 }

 public void calculateArea(){
  System.out.println(" 사각형의 넓이는 : "+width*height);
 }

 
}

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

package overriding.figure;

public class Circle extends Shape{
 private double radius;
 
 public Circle(double radius) {
  this.radius = radius;
 }

 public void calculateArea(){
  
  System.out.println(" 원의 넓이는 : "+radius*radius*Math.PI);
 }
 
}


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

package overriding.figure;

public class Triangle extends Shape{
 private double width;
 private double height;
 public Triangle(double width,double height){
  this.width = width;
  this.height = height;
 }
 public void calculateArea(){
  
  System.out.println(" 삼각형의 넓이는 : "+width*height/2);
 }

 
}

'프로그래밍 > JAVA프로그래밍' 카테고리의 다른 글

의존관계(dependency)  (0) 2012.07.28
final변수  (0) 2012.07.28
상속, 생성자  (0) 2012.07.28
싱글턴 패턴  (0) 2012.07.28
static 예  (0) 2012.07.28
Posted by 조은성
,

* 상속(Inheritance) : 기존의 class에 정의된 변수나 메소드를 재사용하여 새로운 class를 만드는것(물려받는것.- 확장성이 좋아짐)
->객체간의 상속

 

하나의 클래스에서 똑같은 코드를 물려 받아서 사용하는것.
부모-자식 관계

* 객체지향의 장점
1. 확장성
2. 재사용성
3. 유지보수

 

개 : 이름, 성별, 무게, 나이 , 색, 종, 키
      짖는다(),배설한다(),먹는다(),잔다()
고양이 :  이름, 성별, 무게, 나이, 종, 색, 키
  운다(), 배설한다(), 핱힌다(), 먹는다(), 잔다()
사람 : 이름, 나이, 성별, 무게, 키, 국적, 혈액형
          잔다(), 먹는다(), 말한다(), 일한다(),

동물 :  이름, 성별, 무게, 나이, 키
           먹는다(), 배설한다(), 잔다()

* 개, 고양이, 사람은 동물이기에 공통적인 속성을 동물에게 상속받는다.

물려주는 동물 class를 부모(super)class라 하고
물려받는 개, 사람, 고양이는 자식(sub)class라 한다.

* 상속 : is a 관계
-개(서브class) is a 동물(super class)
  개는 동물이다.
- 동물이면 개다.(x)

----------동물-----------
|                         -개 --           |
|                         |        |            |
|                         -----            |
-------------------------

- 동물의 type > 개의 type
   부모 type > 자식 type

* 상속 관계 일때만 type을 부모가 자식보다 type이 크다고 할수 있다.
(다형성에서 부모type이 자식type 보다 더 크다는 것을 사용한다.)
(부모는 추상적, 자식은 구체적)

* 추상화 :  공통점을 뽑아 내는것.(공통적인 것을 뽑아내서 새로운 것을 만들어 내는것.)
(고양이와, 개에 종과, 색이 공통적으로 있지만 사람에 없기때문에 동물로 빼낼 수 없다.)

* 다중 상속 : 부모class를 여러개 갖는것.
* 단일 상속 :  부모class를 하나만 갖는것.

* 자바는 단일 상속을 지원한다. ->class간의 상속을 할 시에는 단일 상속을 지원한다. (여러개의 상속을 하기 위해서는 interface를 지원한다)

동물                                                어류
키, 나이, 성별, 이름
먹는다(), 잔다()                          헤엄친다(), 먹는다()
           ^                                                   ^
           |                                                    |
           ---------------------------
   사람
   국적, 혈액형
   생각한다(), 말한다()

* 다중상속을 하면 상속에 상속을 갖는 구조가 되어 중복되는 메소드가 생겨 오류가 생길 수 있다.
(설계시 코드가 복잡하고 못쓰는 메소드가 생길 수 있어서 자바는 다중 상속을 지원하지 않는다. )

anmal(super class)
 ^
 | (상속)
Human(sub class)

- 코드구현

public class Animal {}
public class Human extends Animal{}

[제한자]class 식별자 extends 부모class이름{ 구현 }

* 상속되어 있는 부모 class가 없으면 object class(최상위 class)가 보이진 않지만 java.lang.Object가 상속되어 있다.
public class Animal extends Object{}

*사람으로 따지면 단군할아버지다.
-Object class에는 속성은 없고 메소드만 가지고 있다. ex :  toString(){}

*
Employee(직원)
-------------
+ id : String
+ name : String
+ salary : int
-------------
+getDetails() : String


Manager(관리자)
--------------
+ id : String
+ name : String
+ salary : int                                             //id,name,dalary,getDetails()는 직원의 것을 가져다 쓴다.
+department : String
---------------
+getDetails() : String


project : day15
package : inheritance.member
class : Employee
    Manager


//MemberTest.java

package inheritance.member;

/*public class MemberTest {
 public static void main(String[] args) {
  Employee emp = new Employee();
  emp.id = "emp-111";
  emp.name = "홍길동";
  emp.salary = 10000000;
  
  String str = emp.getDetails();
  System.out.println(str);
  
  
  Manager man = new Manager();
  man.id = "man-111";
  man.name = "이순신";
  man.salary = 2000000;
  man.department = "개발부";
   str = man.getDetails();
  System.out.println(str);
 }
}
*//*
public class MemberTest {
 public static void main(String[] args) {
  Employee emp = new Employee();
  emp.setId("emp-111");
  emp.setName("홍길동");
  emp.setSalary(10000000);
  
  String str = emp.getDetails();
  System.out.println(str);
  
  
  Manager man = new Manager();
  man.setId("man-111");
  man.setName("이순신");
  man.setSalary(2000000);
  man.department = "개발부";
  str = man.getDetails();
  System.out.println(str);
 }
}
*/
public class MemberTest {
 public static void main(String[] args) {
 Manager m = new Manager("m-111","이순신",200000,"영업부");
 String str = m.getDetails();
 System.out.println(str);
 }
}

 

//Manager.java

package inheritance.member;

public class Manager extends Employee{
 public String department;
 
 public Manager(){}
 public Manager(String id, String name, int salary, String department){
  
//  this.id = id;
//  this.name = name;
//  this.department = department;
  
  super(id,name,salary);
  this.department = department;
  
 }
 public String getDetails(){
  return  this.getClass().getSimpleName()+"[id=" + super.getId() + ", name=" + super.getName() + ", salary=" + super.getSalary()+" department = "+department+ "]";
  
 }
}


//Employee.java

package inheritance.member;

public class Employee {
 private String id;
 private String name;
 private int salary;
 
 //생성자
 public Employee(String id, String name, int salary){
  this.id = id;
  this.name = name;
  this.salary = salary;
 }
 public Employee(){}  //습관적으로 no-argument 생성자를 만들어라
 public String getDetails() {
  return this.getClass().getSimpleName()+"[id=" + id + ", name=" + name + ", salary=" + salary+ "]";
 }
 public String getId() {
  return id;
 }
 public void setId(String id) {
  this.id = id;
 }
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
 public int getSalary() {
  return salary;
 }
 public void setSalary(int salary) {
  this.salary = salary;
 }
 
}

 

'프로그래밍 > JAVA프로그래밍' 카테고리의 다른 글

final변수  (0) 2012.07.28
this, super키워드  (0) 2012.07.28
싱글턴 패턴  (0) 2012.07.28
static 예  (0) 2012.07.28
staticTest[실습]  (0) 2012.07.28
Posted by 조은성
,