오브젝트(객체) 


모든 사물

특성을 표현할 수 있는 속성과 움직을 표현하는 동작으로 이루어짐



 클래스 (Class)


연관되어있는 변수와, 메소드의 집합

객체를 코드로 표현한 것 (객체의 설계도)



 인스턴스 (Instance)


new 를 이용하여 JVM(자바 가상 머신)이 관리하는 메모리에 적재된 것을 의미



 생성자 (Constructor)


클래스를 인스턴스화 하기 위한 코드블록 (메소드의 변형)



 응집도 (Cohesion)


해당 기능을 수행하기 위해 연관된 요소가 얼마나 밀접하게 모여있는지를 나타냄

응집도가 높을 수록 좋음



 결합도 (Coupling)


결합도는 응집도와 대조된다. 소프트웨어 코드의 한 요소가 다른 것과 얼마나 연결되어있는지, 의존적인지를 나타냄

결합도가 낮을 수록 좋음



 메소드 시그니처 (Method Signature)


메소드의 선언부에 명시되는 매개변수의 리스트 (매개변수 개수, 타입)

cf) 오버로딩의 조건은 함수명은 같으나 메소드 시그니처가 달라야 한다.




아래 내용들은 한 번씩 주제로 다루었던 것들이여서 생략


추상화 / 상속 / 다형성 / 캡슐화 (생략)

오버라이딩/오버로딩 (생략)

인터페이스 (생략)




 출처


http://lazineer.tistory.com/93

http://tcpschool.com/java/java_usingMethod_overloading

http://gangzzang.tistory.com/entry/%ED%81%B4%EB%9E%98%EC%8A%A4Class-%EA%B0%9D%EC%B2%B4Object-%EC%9D%B8%EC%8A%A4%ED%84%B4%EC%8A%A4Instance-%EC%83%9D%EC%84%B1%EC%9E%90Constructor

https://opentutorials.org/module/516/5400


출처


이유

http://bitsoul.tistory.com/102


구현법 1

http://bitsoul.tistory.com/100


구현법 2

http://bitsoul.tistory.com/101

'코딩 > 안드로이드' 카테고리의 다른 글

메시지큐, 핸들러, 스레드 사용법  (0) 2016.11.26

출처


http://cholol.tistory.com/142

'코딩 > 안드로이드' 카테고리의 다른 글

안드로이드 Thread 구현법과 Handler 사용 이유  (0) 2016.11.26

출처


http://blog.naver.com/evella/90195438286

http://blog.naver.com/premiummina/220649577170


java 에서는 입출력 을 할때 대부분 Scanner 를 사용하여 입출력을 많이 사용합니다. 

scanner 를 사용하여 int 값과 String 값을 혼용하여 받는 일이 자주 있는데 

nextInt() 후 nextLine() 함수를 호출할 경우 nextLine()함수가 아무것도 입력이 안된 상태로 함수를 끝내는 경우가 있습니다. 

어떻게 고쳐야 할까요?



출처


http://blog.naver.com/grand425/220321547208

'코딩 > Java 프로그래밍' 카테고리의 다른 글

OOP 용어 정리  (0) 2016.12.14
자바 Collections 클래스 Comparator  (0) 2016.11.26
자바 상속, 인터페이스에 의한 다형성  (0) 2016.10.18
자바의 4대 특성  (2) 2016.10.17


■ 서론


다형성을 구현의 다양함 정도로 설명했고 그 예시로 오버라이딩, 오버로딩을 들었다.

다형성에 대해 좀 더 알아보고자 이렇게 정리한다.



■ 바인딩


보통은 참조변수의 타입과 객체의 타입이 일치하지만,  변수의 타입과 객체의 타입이 다른경우를 볼 수 있다.

예를들면 Map mapping = new HashMap(); 이 있다.


어떤 시점에서, 메소드가 호출될 때 어떤 코드를 수행할 것인지가 결정된다.

이러한 결정을 메소드 호출을 메소드 정의에 바인딩(binding)한다고 한다.


많은 경우에, 메소드 정의에 대한 메소드 호출의 바인딩이 컴파일 시간에 일어날 수 있다. 

그러나 다형 참조의 경우에는 실행 시간까지 바인딩을 할 수 없다.



 정적바인딩(static binding / early binding)

 동적바인딩(dynamic binding / late binding)

 private, final, static 이 이에 해당한다.


컴파일러에 의해 컴파일시간에 결정된다.

컴파일러는 객체의 타입을 알 수 없으므로,

Dog타입으로 먼저 컴파일을 진행한 후, 

실행 중 Pudle타입의 메소드가 호출된다.


런타임 중(실행시간)에 결정된다.


   class Dog {

      void sound(){

         System.out.println("멍멍~~");

      }

   }


   public static void main(String[] args) {

      Dog d = new Dog();

      d.sound();

   }

   class Pudle extends Dog { 

      void sound(){

         System.out.println("푸들~~");

      }

   }


   public class Test {

      Dog d = new Pudle();

      d.sound();

   }

 컴파일 시간에 많은 정보가 결정되므로 실행 효율이 높다.

런타임 중에 자유롭게 결정되므로 유연하다. 




■ 상속에 의한 다형성


Animal creature = new Horse(); 라고 선언하면, 변수 creature는 Animal의 어떤 객체라도 참조할 수 있다.

또한 Animal을 상속받는 어느 클래스의 객체 Horse(예시)도 참조할 수 있다.


클래스의 계층구조의 최상단에는 Object가 있는데, Object는 모든 클래스의 객체를 가르킬 수 있다는 말이된다.


Animal을 상속받은 Horse, Hippo 클래스가 있다고 하자.


Animal creature;


creature = new Horse();

creature.move(); ㅡ 1번


creature = new Hippo();

creature.move(); ㅡ 2번


이때, creature의 타입은 Animal이지만,

1번에서는 Horse의 move()가, 2번에서는 Hippo의 move()가 실행된다.


이렇게 상속에 따른 다형의 객체를 참조할 수 있으며, 

메소드 호출 또한 실행 당시의 참조 객체의 메소드를 선택하여 호출하는 것을 상속에 의한 다형성이라고 한다.




■ 인터페이스에 의한 다형성


인터페이스 역시 클래스와 마찬가지로 변수 타입으로 사용될 수 있다.


  public interface Speaker{

    
      public void speak();
      public void announce(String str);

   }

   Speaker current;

     public class Philosopher implements Speaker{

    
         public void speak(){

           System.out.println("Hello");

       }
         public void announce(String str){

           System.out.println(str);

       }

         public void Listen(){

           System.out.println("I got it");

       }


     }


라는 인터페이스와, 참조변수 current를 가정해보자.

참조변수 current는 Speaker 인터페이스를 구현하는 어떤 클래스의 객체라도 참조할 수 있다.


Philosopher 클래스가 Speaker를 implements 한다면

current = new Pilosopher(); 라고 바인딩 할 수 있다.


여기서 주의할 점은,


인터페이스 참조 변수를 사용하고 있을 때, 그 참조 변수가 가리키고 있는 객체가 

인터페이스에 없는 다른 메소드를  포함하고 있다고 할지라도, 그 인터페이스에 정의되어 있는 메소드만을 호출할 수 있다.


current는 Philosopher 타입의 객체를 바인딩 했지만 Speaker 타입이기 때문에, 

Listen()은 사용할 수 없고, Speaker 인터페이스가 가진 speak(), announce() 메소드를 사용할 수 있다.


특별한 상황에서 Listen() 메소드를 호출이 필요할 경우, 캐스팅을 사용해서 할 수도 있다.

Speaker special = new Philosopher();

((Philosopher)special).Listen();




■ 추천 사이트


예시가 아주 잘 나와있다.


https://opentutorials.org/module/516/6127




■ 출처


http://secretroute.tistory.com/entry/140819

http://blog.daum.net/_blog/BlogTypeView.do?blogid=0LoOX&articleno=6036856&_bloghome_menu=recenttext

http://hyeonstorage.tistory.com/266



'코딩 > Java 프로그래밍' 카테고리의 다른 글

OOP 용어 정리  (0) 2016.12.14
자바 Collections 클래스 Comparator  (0) 2016.11.26
[JAVA] Scanner nextInt()나 next() 사용 후 nextLine 입력  (0) 2016.11.26
자바의 4대 특성  (2) 2016.10.17

함수의 호출 방법에는 Call by value (값에 의한 호출) Call by reference (참조에 의한 호출) 

두 가지의 방식이 있다



우선 Call by value의 이해를 돕기 위한 간단한 그림을 준비했다.



Call by reference (참조에 의한 호출)






 

Call by value (값에 의한 호출)






■ 출처


http://luckyyowu.tistory.com/9


자바의 특징이라고하면 객체지향 프로그래밍이다.

교수님 말씀에 따르면

"집을 지을 때 위에서부터 아래로 지으면 C언어고, 밑에서부터 위로 쌓아 올라가면 자바다" 라는데

이게 무슨말인가 싶다.


좀 더 쉽게 설명하자면, 사람을 비유했을 때 C언어는 모든 신체는 사람의 것인 반면 ,

자바는 눈 따로 코 따로 입 따로 팔 따로 다리 따로 몸통 따로 구현을 한 후에 어울려 사람이 되는 것이다. 



■ 객체지향 4대 특징


추상화(Abstract), 상속(Inheritance), 다형성(Polymorphism), 캡슐화(Encapsulation)




■ 추상화(Abstract)




여기서 빨간색 네모는 추상클래스를 나타내고, 나머지는 일반 클래스는 나타낸다.

여기서 추상클래스와 일반클래스의 차이점은 클래스를 객체화 할 수 있느냐 없느냐의 차이이다.


객체는 상태와 행동을 가지고 있어야 하는데, 여기서 동물과 고양이과와 개과라는 것에 대해

세부화는 할 수 있어도, 상태와 행동을 뚜렷이 정의할 수가 없다.


따라서 추상클래스는 선언만 있고 구현 내용이 없거나, 일부만 구현한 미완성 클래스라고 할 수 있다.

추상메소드가 아닌 메소드를 포함할 수도 있고, 상수가 아닌 데이터 선언도 포함할 수 있다.


추상메소드를 포함하거나, 추상클래스로 선언한 것이 추상클래스다.


사용법은 동물, 고양이과, 개과에서 추상화 한 후에,

사자, 고양이, 호랑이, 늑대, 개, 하마에서 extends(상속, 확장)을 받아 사용할 수 있다.


이때, 추상클래스내에 추상메소드가 있을 경우 상속받는 클래스는 반드시 추상메소드를 구현해야 한다.

그래서 필수적으로 구현해야 할 메소드가 있을 때 추상클래스를 사용한다.



※ 주의할점은 추상클래스를 final이나 static으로 선언할 수 없다. 이는 모순이다.

static은 객체 선언 없이 호출이 될 수 있어야 하며, final은 자식클래스에서 재정의될 수 없기 때문이다.




■ 상속(Inheritance)


상속은 기존의 클래스로 부터 새로운 클래스는 유도하는 과정이다.

쉽게 말해서 부모 클래스를 extends로 상속받아 자식 클래스에서 내 것처럼 사용할 수 있다.


시스템을 설게하다보면, 공통된 부분으로 인하여 중복되는 것들이 계속적으로 나올 수 있다.

이럴 때 상속을 이용하여 비슷한 객체끼리 하나의 묶음으로 묶어주고, 공통된 부분을 뽑아서

상위 개념의 부모클래스를 생성한다.


이 객체들이 부모 객체를 상속하면 중복이 제거되며, 공통된 방식으로 설계 할 수 있다.

또한 상속 받는 과정에서 다형성(오버로딩, 오버라이딩)을 사용하여 자유롭게 변형할 수 있다.



■ 인터페이스(Interface)


자바는 다중상속을 할 수 없는데 이를 보완한 방법이 Interface 다.

Interface는 "무엇을 할 수 있는" 으로 표현이 되는데,

그 예로 Serializable, Cloneable, Comparable, Runnable 이 있다.




위의 관계도를 보면서 인터페이스에 대한 예시를 보자.



동물 클래스

 // 동물.java

package inheritance02;
 
public class 동물{
    String myClass;
    
    동물(){
        myClass = "동물";  
    }
    void showMe(){
        System.out.println(myClass);  
    }
}

 

 인터페이스

 // 날수있는.java

package inheritance02;
 
public interface 날수있는{
    void fly();
}

 // 헤엄칠수있는.java

package inheritance02;
 
public interface 헤엄칠수있는{
    void swim();
}

 동물 클래스를 상속받은 클래스

 // 포유류.java

package inheritance02;
 
public class 포유류 extends 동물{
    포유류(){
        myClass = "포유류";  
    }
}

 // 조류.java

package inheritance02;
 
public class 조류 extends 동물{
    조류(){
        myClass = "조류";
    }
}

 포유류 클래스를

상속받고


인터페이스를

구현한


고래,박쥐

클래스

 // 고래.java

package inheritance02;
 
public class 고래 extends 포유류 
implements 헤엄칠 수 있는{
    고래(){
        myClass = "고래";  
    } 
    
    @Override
    public void swim(){
        System.out.println(myClass + "수영 중 어프!! 어프!!");
    } 
}

 // 박쥐.java

package inheritance02;
 
public class 박쥐 extends 포유류 
implements 날 수 있는{
    박쥐(){
        myClass = "박쥐";  
    } 
    
    @Override
    public void fly(){
        System.out.println(myClass + "날고 있다..슈융");
    } 
}



고래를 예시로 들어보자.


포유류 클래스는 동물 클래스를 상속 받았기 때문에, "myClass"라는 변수와,

"shoMe"라는 함수를 사용할 수 있게 되었다.


고래 클래스는 "포유류"클래스를 상속받고 "헤엄칠 수 있는"을 구현 하였다.

따라서 myClass변수와 showMe함수를 사용할 수 있고, swim이라는 함수를 사용할 수 있다.



■ 인터페이스와 추상클래스의 비교


이렇게 보면 인터페이스와 추상클래스의 용도가 얼추 비슷한 것 같아 보인다.



인터페이스와 추상클래스의 공통점

 abstract class(추상 클래스)와 interface 는 선언만 있고 구현 내용이 없는 클래스이다.


그래서 자기 자신이 new를 해서 객체를 생성할 수 없으며,
추상클래스를 extends 받거나, interface를 implements  자식만이 객체를 생성할 수 있다.
상속받은 자식이 구현을 반드시 하도록 해야할 때 사용한다.


 인터페이스와 추상클래스의 차이점

 인터페이스

 추상클래스

● interface라고 선언


● 구현이 전혀 되어있지 않고, 메소드 선언만 되어있다.


● implement를 통해 다중상속의 효과를 낼 수 있다.

● abstract라고 선언


● 일부는 구현이 되어있을 수도 있다.

(abstract 메소드는 구현X)


● extends를 통해 한 번 밖에 상속받지 못한다.



정리를 하면, 인터페이스는 다형성 즉, 행위의 다양함(메소드)을 구현할 때 사용한다.

추상클래스는 부모의 속성을 자식이 그대로 가져가야할 때 사용한다.




■ 다형성(Polymorphism)


객체지향 개념에서 다형성이란, "여러 가지 형태를 가질 수 있는 능력", "사용편의성"을 말하고

오버라이딩(Overriding), 오버로딩(Overloading)이 있다.


오버라이딩은, 말 그대로 덮어 쓴다는 말이다. 상위 클래스로부터 상속받은 메소드를 재정의해서 사용한다.

오버로딩은, 상위 클래스로부터 상속받은 메서드의 이름은 같으나, 인자의 개수가 달라 중복을 허용한다.


예시를 보자.


// Animal.java
package polymorphism01;
 
public class Animal{
    public String name;
     
    public void showName(){
        System.out.printf("안녕 나는 %s야. 반가워 \n", name); 
    
}
 
// Penguin.java
package polymorphism01;
 
public class Penguin extends Animal{
    public String habitat;
     
    public void showHabitat(){
        System.out.printf("%s는 %s에 살아\n", name, habitat);
    }
     
    // 오버 라이딩 - 재 정의 : 같은 메서드 이름, 같은 인자 리스트
    public void showName(){
        System.out.println("어머 내 이름은 알아서 뭐하게요?"); 
    }
    // 오버 로딩 - 중복 정의 : 같은 메서드 이름, 다른 인자 리스트
    public void showName(String yourName){
        System.out.printf("%s 안녕, 나는 %s라고 해 \n", yourName, name); 
    }

} 



※ 재정의를 해서 사용하게 되면, 오버라이딩한 메소드가 호출 된다.

    만약 상위 클래스의 메소드를 호출하고 싶을 경우에는 super.methodName(); 을 하면 된다.



■ 캡슐화(Encapsulation)

 

관련있는 변수와 메소드를 하나의 클래스로 묶어 주고,

접근 제어 지시자를 사용해 외부로부터 정보를 접근할 수 없게 하는 방법이다.

get,set 메소드를 만들어 정보의 은닉, 유지보수를 할 수 있다.


 

Public - 모두가 접근 가능


Protect - 상속받은 클래스, 같은 패키지 내의 클래스에서 접근 가능


default[기본 값] - 같은 패키지 내의 클래스에서 접근 가능


Private - 본인만 접근 가능





■ 출처


http://hyeonstorage.tistory.com/180

http://itewbm.tistory.com/

http://marobiana.tistory.com/58

http://slenderankle.tistory.com/154


+ Recent posts