2013년 8월 11일 일요일

08.08 클래스 기초

클래스 기초

객체란?(1)

- 상태와 행동, 이 두 특성으로 표현되는 모든 대상들.
- Software의 객체도 이와 유사함
- 객체생성을 위한 청사진(blueprint)이다.
- 클래스는 사용자 정의 타입이다.


객체란?(2)

- Software를 객체로 묶는 잇점

  1. Modularity 모듈화 독립성 상승
  2. Information Hiding
  3. Code재사용
  4. Plugability와 Debuging이 쉬워짐


Class란?(3)

- 클래스의 3요소

  1. 필드 - 속성 또는 상태를 저장하는 곳.==> 변수!
  2. 메서드 - 동작 또는 기능
  3. 생성자 - 필드 초기화

- 형식:[지정자]class클래스명{
                         [필드선언] //클래스/인스턴스변수
                         [메서드 정의]
                         [생성자 정의]
}

필드(1)==> 변수!

- 속성 또는 상태
- 객체가 처리할 데이터를 저장하는 곳.

(1) 인스턴스변수
  변수선언시,static지시자 없이 선언된다.
  클래스를 객체화 할 때 마다 메모리에 새로 생성됨.

(2) 클래스변수 (또는 static변수)
  변수 선언시, static으로 선언된다.
  클래스가 업로드 될 때 메모리에 한 번 생성됨.
// 클래스 변수
// - 클래스에 static 으로 선언된 변수
// - 클래스가 메모리에 로딩될 때 준비된다.
// - 클래스의 모든 메서드가 접근 가능.
// - 만약 해당 변수가 public, (default), protected로 공개되었다면,
//   그 조건에 맞추어 다른 클래스에서 접근할 수 있다.

// static 블럭
// - 클래스가 로딩되고 난 후 사용되기 전에 필요한 값을 준비하는 블럭
// - 스태틱 블럭에서는 스태틱 변수와 스태틱 메서드만 사용가능. 인스턴스 변수/메서드 접근 불가!
// - 클래스가 로딩되고 난 후 즉시 딱 한 번 이 블럭을 수행한다.
static {
scanner = new Scanner(System.in);
}

public class CalculatorView02 {
public static void inputForm() {
// 로컬변수
// - 메서드 및 블럭 안에 선언된 변수
// - 해당 블럭 내에서만 사용 가능
// - 메서드의 변수는 메서드의 블럭 안에서는 사용가능
// - 메서드 안에 선언된 모든 로컬 변수는 다른 메서드에서 사용 불가능

int result = 0;
...
}

}

  • 인스턴스변수
    • static이 붙지않은 멤버변수
    • 객체가 생성될때
    • 객체마다 독립적인 공간에 존재
    • 인스턴스 고유의 상태를 유지해야 되는 경우에 사용
    • 객체를 생성한후, Object reference(객체의레퍼런스)를 통해서 접근
    • 형식 - [접근 지정자] 데이터형 변수명;//초기값으로 자동으로 초기화
    •           cf) 로컬변수는 자동 초기화 안됨
    • 인스턴스화 : 개별적으로 관리되어야 할 값은 인스턴스 변수에 저장해야 한다.
         인스턴스 변수는 static 을 제외한다. static은 공유되는 영역으로 동시에 개별적으로 값을
          입력받거나 할 수 없다. 이럴 때는 인스턴스화 시켜야 한다.

  • 클래스변수
    • static으로 선언되며 모든 객체가 공유
    • 클래스가 메모리에 올라갈때 
    • 인스턴스를 생성하지 않고 사용가능.
    • 공통적인 값을 유지해야 하는 속성의 경우에 사용
    • 객체를 생성하지 않고도, 클래스명을 통해서 접근 => 공유(공통속성 저장유리)
    • 형식 - [접근지정자] static데이터형 변수명;
  • 로컬변수(지역변수)
    • 메서드가 일시적인 상태를 저장하기 위해 선언된 변수
    • 메서드의 블록내에서만 선언 및 접근가능.


객체의생성(1)

- 키워드 new와 함께 클래스의 생성자를 호출함
- 생성자가 호출되면,객체 인스턴스가 메모리에 생성되고,
- 참조형 변수에 생성된 객체의 위치정보가 저장됨.
- 형식 - 클래스형 변수명 = new 클래스생성자([인자]);

객체의생성

- 키워드 new와 함께 클래스의 생성자를 호출
- 생성자가 호출되면, 객체 인스턴스가 메모리에 생성되고,
- 참조형 변수에 생성된 객체의 위치정보가 저장됨.
- 형식 - 클래스형 변수명 = new 클래스명([값]);
            변수명.필드명;
            변수명.메소드명([값]);
- 객체의 멤버에 접근하기 위해서 변수명과 (.)을 사용함
(같은 클래스 내의 메소드 및 필드에 접근하기 위해서  this.(현재 객체를 의미)을 사용할 수 있음)

@교재실습.--P 145 147 148 151 AirCon/AirConUse/AirConUse2/VariableKind
   - 인스턴스,static,local변수 관련


메서드(1)

- 행동을 표현
- 작업을 수행하는 명령어들의 집합.
- 필드(멤버변수 또는 인스턴스 변수)에 저장된 데이터를 수정,조회하는 용도로 사용됨.
- 호출을 통해서 동작 -- 메소드는 호출. 필드(변수)는 정의.
- 모든 객체가 공유해서 사용.

메서드(2)

- 형식[지정자] 반환자료형 메서드명([매개변수선언]) {
          ...//메서드가 처리하는 실행문.
          [return 반환값]
}
- 메서드명은 동사형이며 소문자로 시작(규약)
- 호출시 전달받을 인자에 대한 매개변수의 선언은 변수 선언과 동일함
- 반환한 값이 있는 경우, 반환자료형을 지정.
반환자료형은, 기본자료형, 참조형(배열,클래스,인터페이스)이 모두 가능, 반환할 결과값이 없는 경우  void로 명명)

main 메서드

- 프로그램의 시작점인 메서드.JVM에 의해 가장 처음 호출된다.
- 어플리케이션은 반드시 한개의 main메서드를 갖는다.

- 형식 - public static void main(String[] args) {
                  ...
            } 규칙!!!


클래스 메서드와 인스턴스 메서드

메서드 앞에
- static이 붙으면 클래스메서드,
- static이 안붙으면 인스턴스 메서드.

  1. 클래스 메서드
    1. static으로 선언된 메서드
    2. 객체를 생성하지 않고, 클래스 이름을 통해서 호출할 수 있음.
    3. static변수만 사용 가능 (인스턴스 변수는 사용할 수 없다.)
  2. 인스턴스 메서드
    1. static이 붙지 않은 메서드
    2. 객체를 생성한 후,Object reference를 사용해서 호출할 수 있음
    3. static변수와 인스턴스 변수 모두 사용할 수 있다.


오버로딩(Overloading)

- 같은 이름의 메서드(또는 생성자)를 정의하는 것.
- 같은 이름으로 된 메서드 또는 생성자를
  '오버로딩메서드' 또는 '오버로딩생성자'라고 함.

- 오버로딩(Overloading) 규칙
  1. 메서드(또는 생성자) 이름이 같아야 한다
  2. 매개변수들의 갯수,타입 또는 순서달라야 한다.
  3.                   (반환자료형은 영향을 주지 않는다.)
- 예) Overloading 메서드
   public class MyMath {
      public static short add(short a, short b) { return (short)(a+b); }
      public static int add(int a, int b) { return (a+b); }//오버로딩 메서드
   }

public int sum(int a, int b) {
return a+b;
}
public int sum(int a, int b, int c) {//갯수 다르게,(만약 같은 type의  같은이름  변수쓰면서 순서 바꾸면 동일하게 인식하여 err).
return a+b+c;
}
public short sum(short a, short b) {//type 다르게
return (short)(a+b);
}
//순서가 적용되는 경우
public int sum(int a,float f) {
return (int)(a+f);
}
public int sum(float f,int a) {//type이 다른경우 순서 변경시 다르게 인식.
return (int)(a+f);
}



@실습 - P166,164 : static과 instance메서드 관련

생성자

- 객체가 생성될때,멤버필드의 초기화 작업을 수행하는 메서드
- 클래스명과 동일한 이름을 가지며, 반환자료형 없음
- 형식-[접근지정자]생성자명([매개변수]) {
          ...
    }
- 매개변수를 이용해서 멤버필드를 초기화하거나 그밖에 필요한 작업을 위하여 사용.
- 예) public class Member{
   String namek
   int age;
   public Member(String name,int age) {
      this.name = name; //멤버필드 name 초기화
      this.name = age;    //멤버필드 age의 초기화
   }
}
this => 자신을 가리키는 레퍼런스 객체

기본생성자

- 매개변수가 없는 생성자
(컴파일러는 어떤 생성자도 존재하지 않는 경우에 empty인 기본생성자를 클래스에 자동으로 포함시킴)
- 형식-[접근지정자]생성자명() {}
- 예) public class Member{
             public  Member(){
                   ...
             }
        }

this() 생성자 

http://jeami.tistory.com/entry/This
http://blog.daum.net/gunsu0j/334

생성자 안에서 다른 생성자를 호출할때 this()사용!.
이때는 생성자 block 내의 첫번째 구문(라인)이어야 함.
- 예) public class Member{
             int id;
             String name;
             public  Member(){
                  this.name=name;
             }
             public  Member(int id,String name){
                  this(name);//this()이용해서 생성자 호출-블럭내 첫줄!
                  this.id = id;
             }
/*
             public  Member(int id,String name){ //같은내용
                  this.name=name;
                  this.id = id;
             }
*/

        }

[this]
-- 참조 변수 this
인스턴스 자신을 가리키는 참조변수로 해당 인스턴스의 주소값을 가지고 있음.
static에서 사용 불가.
-- 생성자 참조 함수 this()
같은 클래스 내의 다른 생성자를 참조할 때 사용.

초기화 블럭

- 복잡한 초기화 작업이 필요한 경우 초기화 블럭을  사용

  1. 클래스 초기화 블럭
    1. 클래스 초기화 블럭: 클래스변수의 초기화에 사용
      ( static을 블럭앞에 붙임 )
    2. 클래스가 메모리에 처음 로드될때,한번만 수행됨.
  2. 인스턴스 초기화 블럭
    1. 인스턴스 변수의 초기화, 인스턴스 생성할 때마다 수행됨.
    2. 생성자들 공통으로 수행되는 작업을 인스턴스 초기화 블럭 에 넣는다.

필드의 초기화

- 멤버필드는 자동적으로 디폴트값으로 초기화
- 알고있는 특정한 값으로 초기화 가능.

- 멤버변수의 초기화 순서

  1. 클래스변수의 초기화 순서
    1. 기본값 초기화
    2. 명시적초기화
    3. 클래스 초기화 블럭 수행
  2. 인스턴스변수의 초기화 순서
    1. 기본값 초기화
    2. 명시적초기화
    3. 인스턴스 초기화 블럭
    4. 생성자(호출)

public class InitTest {
// private static int a;// default 0
// private        int b; //0
// private char c; // 0000
// private String s; //null

private static int a;
private        int b;
private static int [] static_arr;
private        int [] instance_arr;

private char c='A';
private String s="AAA";

//초기화블럭(static 클래스변수) : 로직이 필요한 초기화에 유용
static{
for (int i = 0; i < static_arr.length; i++) {
static_arr[i] = i*2;
}
}

//초기화블럭(인스턴스변수) : 로직이 필요한 초기화에 유용
{
for (int i = 0; i < static_arr.length; i++) {
static_arr[i] = i*2;
instance_arr[i] = i*10;
}
}
//생성자
public InitTest(int b){
this.b=b+instance_arr[0]+instance_arr[2];
}

}
@실습 - P169,171,174 



setter 메서드 와 getter 메서드

- 프로퍼티의 값을 설정하거나 읽기 위해서 사용.
(프로퍼티는 setter와 getter 메서드를 갖고있는 멤버필드)
- encapsulation 캡슐화에 유용
- setter와 getter 메서드의 이름은 다음같이 지정.
형식 : set + 프로퍼티명(또는 필드명)
         get + 프로퍼티명(또는 필드명)//프로퍼티명의 첫글자는 대문자
예) 프로퍼티 age 에 대해, setAge(), getAge()
public class Student {
   private String name;

   public void setName(String n){
      name = n;//프로퍼티네임의 setter
   }
   public String getName() {
      return name;//getter
   }
}


1.객체의 필드의 참조

- 객체의 필드들은 필드명에 의하여 접근된다.
- 외부의 코드는 반드시 객체레퍼런스, 필드명을 사용해야 한다.
- 예)
Class Rectangle {
   int width;
   public Rectangle(int w) {
      width=w; //내부에서 width필드의 접근.
   }
}

Class B {
   public static void main (String args[]) {
      Rectangle rect = new Rectangle(100);// width 초기화
      Int length = rect.width; // 외부에서 width 필드의 접근
   }
}

- 객체 참조를 통한  instance필드의 효출은, 특정한 객체의 필드 호출을 의미한다.
- 그밖에, 객체의 접근을 위하여, new 연산자가 반환하는 object reference값을 바로 사용할 수 있다.
이 경우, 프로그램은 객체의 reference를 갖지 않게 되므로, 이 객체는 Garbage Collection의 대상이 된다.
예) int width = new Rectangle(100).width;//








댓글 없음:

댓글 쓰기