2011년12월12일_JAVA_인스턴스메소드와 정적메소드, 메소드 오버로딩, 객체의 복사, 패키지



★ 공부를 숙제처럼 하지 말자. 그 때 그때 확실히 익히고 넘어가자.
   공부를 하는 방법이 잘 못 되었고 수업시간, 복습시간 즉, 시간을 투자하자. (기본적인 것)
   시간을 투자하지 않으니 지식의 기반이 약하다.
★ 잘 모르는 것을 쓸데 없이 부풀리지 말고 핵심만 정리해 말하자.
  -> 핸드폰포장이 점점 작아진다. 과거엔 휴대폰이 비싸니 포장이 간소하면 싸보여 포장을 과하게함.
     알맹이가 중요하지 껍데기는 필요하지 않다. 뭐든지 심플하게 하라.
★ 정리 – 상대 질문의 의도를 캐치하라.

★ 욕을 듣는 방법
  “지금 몇 시야? (화남)”   ---> “10시 입니다.”                  (이러면 개념과 싸가지 없는 놈이다.)
                               ---> “늦어서 죄송합니다. (반성)”  (이렇게 하라.)
  “객체란 무엇인가?”      ---> “인스턴스입니다.”              (말장난 하냐 같은 것을 뜻하는 용어자나)





인스턴스 메소드와 정적 메소드

● 인스턴스란 무엇인가?
인스턴스(객체)는 클래스가 실제 구현된 것.
내 생각은 클래스 형태의 관점으로 메모리를 바라본다는 것이다.

┌ 인스턴스메소드는 객체를 생성해야 호출이 가능하다.
└ 정적메소드는 객체 생성없이 호출가능하다.

●  정적메소드내에서 인스턴스변수는 사용불가능.
  객체가 존재하지 않음 –> 인스턴스 변수/메소드 둘 다 사용불가.

● 정적메소드의 예와 사용법
  Math.sqrt(34.5)       System.out.println(“안녕하삼~ 짜장면 탕수육 곱배기 시키면 만두 하나 주삼~”);






메소드 오버로딩 (Method Overloading)

┌ 오버로딩: 인자가 다름. 반환자료형은 무관.
└ 오버라이딩: 인자가 같음.
오버로딩과 오버라이딩이 가능하니 JAVA는 다형성을 지원한다.

● 메소드 시그니처: 오버로딩된 메소드를 구분하는 메소드이름, 인수의 개수, 순서

● 가장 빈번히 사용되는 오버로딩은 생성자
    println()도 여러 자료형의 인수를 취하는 오버로딩된 메소드이다.





객체의 복사


객체를 복사하기 위해 아래와 같은 코드를 실행하면...
Rectangle rectA = new Rectangle(10, 20);
Rectangle rectB = rectA;

rectA와 rectB는 객체 참조변수로 메모리 힙 영역에 존재하는 객체의 주소를 가지고 있다. (메모리 동적할당과 비슷)

rectA ───┬───> 객체
rectB ───┘

결국 상기와 같이 rectA와 rectB는 같은 객체를 중복해서 가리키게 되고 객체를 복사하진 못 한다.
객체를 복사하기 위해선 복사생성자를 사용하여 객체를 생성하며 객체를 인자로 받아 그 내용을 새로 생긴 객체에 복사해야 한다.

   1: class Rectangle
   2: {
   3:     Rectangle (Rectangle oldRect) 
   4:     {
   5:         length = oldRect.length;
   6:         width = oldRect.width;     
   7:     } 
   8: }

3행에서 7행까지 코드는 Rectangle클래스의 복사생성자로 Rectangle클래스로 선언된 객체를 인자로 받아 속성값을 복사한다.
C++과 다르게 JAVA는 C++과 다르게 값/참조/포인터 전달 구분이 없이 변수는 값 전달, 객체는 참조전달로 고정되어 있다.
사용법은 아래와 같다.

Rectangle rectA = new Rectangle(10, 20);
Rectangle rectB = new Rectangle(rectA);

rectA ──────> 객체#1 (10, 20)
rectB ──────> 객체#2 (10, 20)

두 객체는 같은 속성값을 가지게 된다.




패키지(Package)

C++의 namespace와 비슷한 개념으로 패키지 이름으로 클래스들을 묶는다.
다른 점은 패키지이름과 같은 디렉토리에 클래스들을 넣어야 한다는 것이고,
명시하지 않으면 디폴트패키지이다.
클래스가 정의된 파일의 첫 줄에 package [패키지이름]; 을 추가하면 된다.