기억의 DataBase

객체지향 본문

Java

객체지향

Zester; 2019. 1. 16. 11:51
  • 객체지향
객체지향에서 가장 중요한 것은? 
"이름" >> 직관을 받을 수 있는 이름 >> 이름만 보고서 안의 메소드를 예상할 수 있어야 함

  • 객체지향의 2가지 중점
    1.추상화 : 중요한 것은 남기고 불필요한 것은 삭제
    2.응집도 : 관련된 것을 잘 모음

객체지향에서 재사용은 중요(라이브러리) - 업무에서 사용되는 객체는 재사용이 어렵다

좋은 객체는 이름만 봐도 뭔지 예상할 수 있어야 하고, 필요한 것을 잘 모으고(응집도),
필요없는 것은 삭제해야 하며(추상화), 독립적으로 기능할 수 있어야 한다(낮은 결합도) 
(객체는 역할과 책임이 있다)

  • 오버로딩(Overloading)
ex) 밥버거/보쌈/장조림을 먹었습니다(음식(parameter)은 변하지만,
      동사(method)는 변하지 않는다)

C언어의 경우 파라미터의 수나 TYPE이 다르면 이름이 다른 함수를 만들어야 함
ex) plusInt(int, int) / plusFloat(float, float)

BUT JAVA의 경우 재활용이 가능
ex) plus(int, int) / plus(float, float)가 가능하다

parameter의 수와 type이 달라도 같은 이름으로 재사용이 가능!


어려운 문법을 사용하면 개발자는 힘들지만, 사용자는 편함

  • 상속(문법이 아니라 개념이해가 더 중요 - is a / kind of 관계가 성립)

           
  • 추상클래스 - 단어는 있지만,
    인스턴스가 될 수 없는 Class(자동차) - 일반화(공통점)
             ex) 자동차 c = new 자동차(); >> X        
             ex) 자동차 c1 = new 버스();  >> O
            >> 버스()는 자동차다
    
  • 조상타입의 참조변수로 후손 인스턴스를 참조할 수 있다★
      (오버라이딩이 되어 있지 않다면, 조상타입 메소드만 사용 가능)
            ex) 자동차 c1 = new 버스(); >> O >> 달리다();만 쓸 수 있다
            ex) 자동차 c2 = new 이층버스(); >> O >> 달리다();만 쓸 수 있다

            왜 이렇게 생성하는가 >> 상황에 따라서 기능을 제한하기 위해서
            ex) 포크레인 주차를 맡긴 상황 (달리다(); 기능만 사용할 수 있게 제한)

            ※ 아무것도 상속받지 않으면 Object class를 상속받는다
             >> 모든 클래스의 부모(최상위 클래스)
            
  • 오버라이딩(Overriding)
           ★기존의 메소드가 오버라이딩(중복되어 구현)되면, 무조건 자식의 메소드가 사용된다
            ex) 자동차 c = new 스포츠카();
   달리다(); > 전륜구동  /  달리다(); > 후륜구동 >> 후륜구동이 실행됨
                  
  • 인터페이스(Interface) - 껍데기 / 인스턴스가 될 수 없음


기능을 미리 선언하는 방법(요구사항 정의)  
어떤 기능을 구현하겠다는 선언(일종의 to DoList)
실제 기능은 클래스를 통해서 구현(상속의 관계가 아님) 
분석을 하면 나오는 것(설계 > 클래스)
ex) 자동차는 운전석를 구현한다(O) <> 자동차는 운전석이다 / 자동차는 운전석의 종류다(X)
ex)  Collection을 만들자 
    > Collection을 분석해보니 A기능, B기능이 필요(선언 - 인터페이스)

자바는 다중상속을 지원하지 않아서 인터페이스로 그 부분을 해결?(자바는 단일상속)
>> NO! 하나의 인터페이스로 한 클래스만 구현해도 필요하다!!

※ 어떤 언어를 공부하든, 그 언어의 철학에 맞게 공부해야
    실제 코드 작성시 그 언어에 맞게 구현할 수 있음!

※ 인터페이스 type으로, 해당 인터페이스를 구현하고 있는 클래스의 인스턴스를 참조할 수 있음
    ex) Collection<String> col = new HashSet<>();

        public static void main(String[] args) {
             
             // 인터페이스             // 클래스 
             Collection<String> col = new HashSet<>();
             col.add("kim");
             col.add("lee");
             col.add("park");
             col.add("choi");
             
             // 인터페이스
             Iterator<String> iter = col.iterator();
             while(iter.hasNext()) {
                    
                    String str = iter.next();
                    System.out.println(str);
                    
             }
             
       }

        public static void main(String[] args) {
             
             //인터페이스(Dice)는 주사위를 굴린다는 기능만 있음
             Dice dice6 = new Dice6();
             // 실제 클래스(Dice6/Dice9)에서는 굴렸을 때 값을 6까지 할지 9까지 할지를 구현
             int value = dice6.get();
             System.out.println(value);
             
             Dice dice9 = new Dice9();
             value = dice9.get();
             System.out.println(value);

       }

※ 인터페이스는 기능만 선언한 상태이고 세부적인 동작이나 범위는 클래스에서 지정

※ 인터페이스와 상속의 차이



'Java' 카테고리의 다른 글

생성자  (0) 2019.01.17
예외처리(Exception)  (0) 2019.01.17
package(디렉토리)와 중요 package  (0) 2019.01.14
OOP(Object Oriented Programming) - 객체지향과 Memory  (0) 2019.01.14
JAVA Start  (0) 2019.01.11
Comments