2016년 1월 28일 목요일

[JAVA 교육] OOP / 클래스 / 변수 / this & super

[JAVA 교육] OOP / 클래스 / 변수 / this & super

(*본 게시물은 본인이 교육을 통해서 배우는 내용을 정리하는 글입니다. 부족한 부분이 많으니 참고해주시기 바랍니다. 혹시 정확한 의미를 알고 싶으시거나, 틀린 내용에 대해 조언해주시고 싶은 분들께서는 댓글을 남겨주시면 최대한 빠르게 답변하겠습니다. 감사합니다.)


1. Review - 제어문
(1) 조건문
     1) if(조건식)
     2) switch(표현식)
(2) 반복문 레이블을 지정할 수 있다.
     1) for : 반복횟수가 정해져 있을 때
    2) while : 반복횟수가 정해져 있지 않을 때
     3) do-while : 1회 이상 실행할 때
(3) 탈출문 break와 continue는 레이블과 함께 사용하여 흐름을 제어할 수 있다.
   1) break : 진행중인 반복문을 완전히 탈출
   2) continue : 진행중인 반복문을 1회 skip
   3) return : 메소드 탈출
(4) 배열
   1) 특징 : 동종, 크기 불변
   2) 순서
          a. 선언
         b. 생성
          c. 초기화
   3) 객체배열
          a. 선언(ex. Person[] customers; )
          b. 생성(ex. customers = new Person[10]; )
       c. 초기화. 기본형 배열처럼 {}를 이용한 직접 초기화가 안된다.
                  new를 이용한 객체 생성 후 할당해야 한다. (ex. customers[0] = new Person(); )



2. OOP

1) 객체 지향 프로그래밍
   * OOP : Object Oriented Programming
   * '부품 객체를 먼저 만들고 이것들을 하나씩 조립해 완성된 프로그램을 만드는 기법' 이 의미는 좀 아니다.
   이 의미는 '컴포넌트 기반 개발'을 의미한다.
   * 실제 현실의 객체를 프로그램에 그대로 적용시키는 것을 객체 지향 프로그래밍이라고 한다.

2) 장점
   * 재사용성이 높다.
   * 그래서 개발 생산성이 높다.
   * 'CBD(컴포넌트 기반 개발)'이 가능하다.

3) 클래스와 객체
   (1) 클래스 : [책 설명]객체를 만들기 위한 틀(Templete, Blueprint, 설계도)
   (2) 객체 : 클래스의 인스턴스, 유형 또는 무형 사물

4) 객체추상화 : 현실 객체를 프로그램에 클래스(가상)로 가져오는 것.
   (1) 클래스를 만드는 과정
   (2) 객체의 특징을 분석
        a. 명사적 특징 (ex. 보드마카 - 색깔) : Data. 정보. Field(변수). Attribute(분석/설계에서 주로 쓰는 단어)
        b. 동사적 특징 (ex. 보드마카 - 쓰다) : method. behavior, operation(분석/설계에서 주로 쓰는 단어)
        c. 예시(Pen)
             1. 명사 : color
             2. 동사 : write

5) 객체간의 관계(네모박스는 클래스)
   (1) Association(연관)

   (2) Aggregation(복합연관)(집합관계) : B가 공유

   (3) Composition(집합연관)(집합관계) : B는 A의 전유
        A has a B

   (4) Generalization(일반화)
        B is a A, inheritance

   (5) Realization(실체화)
        implementation

   (6) Dependency(의존)

6)  특징
   (1) Encapsulation
        1. 접근제한자
        2. 변수는 private, 메소드는 public
        3. 이유 : 입력 data 검증(변수에 직접 넣으면 if문으로 확인 불가하지만 setter로 넣으면 if문으로 검증가능), 권한 체크

   (2) 상속 Inheritance
        1. 단일 상속
        2. extends 키워드를 이용한다.
        3. is-a 관계
        4. Object를 상속
        5. 필드, 메서드만 상속
        6. 부모객체를 참조할 때는 "super."
        7. 일반화(Generalization) - 분석/설계할 때 사용하는 상속 용어

   (3) 재정의 Override
        1. 부모가 가진 메서드를 자식이 다시 재정의한 메서드를 만드는 것.
        2. 이름이 동일해야한다.
        3. 파라미터도 동일해야한다.
        4. 리턴타임도 동일해야한다.
        5. access modifier는 부모의 접근제한레벨보다 자식의 접근제한레벨이 더 public해야한다.
        6. 부모가 static이면 자식도 static이어야 한다.
        7. final 변수는 재정의 불가능(final 붙인거는 '상속은 해줄건데 고치지는 못한다~' 라는것)
        8. 부모에서 throws하지 않는 새로운 예외는 throws할 수 없다.
   (4) Polymorphism 다형성



3. 클래스

1) 정의 : class 클래스 이름 {}

2) 구성요소
   (1) 변수(Field)
        a. instance 변수
        b. class변수 = static 변수
   (2) 메서드
   (3) 생성자(Constructor)
        a. 용도 : 인스턴스 변수 초기화, 객체 생성시 new와 함께 사용
        b. 기본 생성자 : 인자 없음. 컴파일러가 추가(생성자가 없을때)
        c. 규칙
             1. 클래스명과 동일해야한다.
             2. 메서드처럼 생겼지만 메서드는 아님. so, 리턴타입 없음.
             3. Overloading이 가능하다.(중복, 인자가 다를때).
             4. 첫줄에는 super() 또는 this()가 와야 한다. 없으면 super()자동으로 온다.
                  1. super() : 부모클래스의 생성자를 호출(참조)할 때 사용
                  2. this() : 동일 클래스 내의 다른 생성자를 호출(참조)할 때 사용
   (4) static {}, static initializer
   (5) {}, instance initializer
   (6) 내부클래스

3) 예시
class Pen {
   //변수=데이터=속성
   //변수 : 고유 데이터, 상태 값, 다른클래스의 객체
   String color;
   void write() {

   }
   Pen() {
        //생성자. 리턴타입이 없다. 이름은 클래스 이름과 똑같다.
   }
   static {
        //static 변수 초기화
    }
   {
        //instance 변수 초기화
    }
}

4) 객체 생성
   (1) 선언 ex. Pen mypen;
   (2) 생성 ex. mypen = new Pen();



4. 변수
1) 멤버(Member)변수 - 클래스 안, 초기화 하지 않아도 default값으로 초기화 된다.
   (1) instance 변수
      * 반드시 객체를 생성화하고 호출해야한다.
        * 객체마다 각각의 값을 가진다.
        * 생성자, {} 에서 초기화
   (2) class 변수 = static 변수
        * class 이름만으로 참조가능
        * 모든 객체가 같은 값을 공유한다.
        * static {} 에서 초기화

2) 지역변수 - 메소드 안
   (1) 매게변수=Parameter
   (2) Local 변수 : 반드시 초기화 한 후에 참조해야한다.

3) 상수 - fianl
   (1) 멤버변수 : 상수로 사용하기 위해 final상수 사용.
   (2) 지역변수 : 로컬클래스(Local Class)에서 변수를 참조하기 위해서 final 상수 사용.
        * 메서드안에서 내부클래스를 만들고 그 안의 메서드에서 바깥 메소드의 지역변수를 참조하는게 안된다. 이유는 스택에 바깥 메서드 위에 내부 클래스의 메서드가 올라가는데 스택은 메모리 주소로 값을 참조하는게 아니라 stack point를 옮겨서 참조하기 때문에 바깥 메서드의 지역변수를 참조하려면 내부 클래스의 메서드가 종료되어야하기 때문이다. 값을 사용해서 메서드를 진행하려 하는데 메서드를 종료해야한다는건 역설이다. 그렇기 때문에 바깥 메서드의 지역변수를 final로 지정해서 그 지역변수를 heap에 저장해놓고 내부 클래스의 메서드가 사용할 수 있게 한다.



5. this & super
1) this. , super. - 멤버 참조
   (1) this. : 현재 객체의 멤버
   (2) super. : 부모 객체의 멤버
   (3) 위치 : 매서드, 생성자 안에서 사용

2) this(), super() - 생성자 참조
   (1) this() : 현재 클래스의 다른 생성자 호출
   (2) super() : 부모 클래스의 생성자 호출

3) 위치
   (1) 생성자 첫 라인 : 여기에는 this()나 super()만 사용할 수 있다.



6. Tip
1. 이클립스에서 Export해서 jar로 실행파일 만들기 
   1. 순서 
        1. 원하는 package 우클릭 - Export 선택
        2. Java - JAR file 선택 - Next
        3. 원하는 소스 선택하고 밑에 'Select the export destination'에 저장할 위치\파일 선택(Browse 선택해서) - Next
        4. 'Export class files with compile errors'와 'Export class files with compile warnings' 체크 - Next
        5. 밑에 'Select the class of the application entry point'에서 메인이 있는 메인클래스를 선택한다. - Finish
   2. cmd에서 실행은 'java -jar [filename.jar]'
     하지만 매번 이렇게 입력하기 귀찮으니깐 bat파일 만들어서 bat파일을 실행한다.
        >>@echo off
        >>java -jar [filename.jar]
   이렇게 두줄 입력하고 cmd에서 [이름.bat]만 입력하면 실행된다.
   echo off를 안하면 java -jar 입력줄까지 cmd에 표시가 된다.
2. Object vs Instants = 유일 vs 무한
3. Class 생성자를 만들때 이클립스에서 편리한 기능을 제공해준다.
   우클릭->Source->Generate Constructor using Fields->OK
4. initializer(static, instance)=초기화자에서는 프로그램 수행간 처음 한번만 수행 되는 동작(드라이버 로드 등)을 수행할 때 좋다.
5. static {} 블럭 안에서 non-static 멤버를 "직접" 참조할 수 없다.
   그래서 main에서 사용할 멤버들은 static이 붙는다.
   참조하고 싶으면 non-static멤버를 가지고 있는 클래스를 객체화하여 사용해야한다.
6. cmd에서 패키지 컴파일 할때는 javac -d 옵션이 중요하다.


댓글 없음:

댓글 쓰기