7. 클래스 내부 구성요소

InSeok·2022년 5월 15일
0

자바

목록 보기
7/9

참조 : Do it Java 완전정복
http://www.yes24.com/Product/Goods/103389317

필드

필드와 지역변수 구분

  • 필드 :클래스에 포함된 변수로, 객체의 속성값을 지정할 수 있다.
  • 지역변수(variable) : 메서드에 포함된 변수
  • 클래스 중괄호 안에 선언된 변수 - 필드 , 메서드 중괄호 안에 선언된 변수 - 지역변수
  • 필드 - 힙 메모리의 객체 내부, 지역변수 - 스택메모리에 생성
  • 스택 메모리에 저장되는 변수는 자신이 선언된 메서드의 중괄호가 닫혀 메서드가 종료되면, 그 메서드 안에 선언된 모든 지역 변수가 메모리에서 통째로 삭제됨
    • 프레임 - 1개의 메서드 안에 선언된 모든 지역 변수들의 집합
  • 힙메모리의 객체 안에 저장되는 필드는 객체가 사라지지 않는 한 절대로 삭제되지 않음
  • 스택 메모리는 나중에 들어간 것이 먼저 나오는 LIFO(Last In First Out)구조를 띈다.
  • 스택영역에 저장되는 지역 변수는 강제로 초기화 되지 않음
  • 힙 영역에 저장되는 필드는 초깃값이 없을 때 강제로 초기화됨.

메서드

메서드 정의

  • 자바 제어자 리턴(반환) 타입 메서드명(입력매개변수) { 메서드 내용 }
    public static           int               sum   ( int a, int b) {   }
  • 리턴 타입은 소문자로 시작
  • 입력매개변수 - 메서드를 호출할 때 전달되는 값의 자료형과 전달받은 값을 저장할 지역 변수명을 정의
  • 리턴 타입이 void가 아닐때 메서드 안에는 반드시 ‘return 리턴값’의 코드가 있어야 한다.
  • void - 메서드가 종료된 이후에 아무런 값으로 변하지 않음

메서드 호출

  • 클래스 외부에서 메서드를 사용하려면 먼저 객체를 생성해야 한다.
  • 객체의 위치를 저장하고 있는 참조 변수를 이용해 매서드를 호출해야한다.
  • 리턴 값이 있는 메서드는 일반적으로 리턴되는 값을 저장 할 수 있는 변수를 선언해 대입 한다.
    • int k - a.data()
  • 입력 매개 변수가 있는 함수를 호출할 때는 해당 자료형의 값을 넘겨 줘야 한다.
    • ex) double sum (int a, double b) → a.sum(3,5.2)

클래스 내부에서 메서드 호출

  • 클래스 내부에 있는 메서드 끼리는 객체를 생성하지 않고 서로를 호출할 수 있다. (필드도 동일)
  • 다만 메서드 앞에 static이 붙어 있을때는 static이 붙은 필드 또는 메서드만 호출가능
  • 같은 멤버 끼리는 클래스 내부에서 얼마든지 객체 생성없이 서로를 호출가능

기본 자료형 입력매개변수와 참조 자료형 입력 매개변수의 차이

  • 참조 자료형이 입력 매개변수로 넘겨질때 객체의 위칫값이 전달

  • 등호(=)는 스택 메모리를 복사한다.

  • 기본 자료형을 입력 매개변수로 전달하면 전달 받은 메서드는 값을 복사해 사용

  • 참조자료형은 스택 메모리에 객체의 참조값(위치값)을 저장하므로 실제 객체가 아닌 객체의 참조값이 전달돼 복사된다.

  • 호출된 메서드에서 객체의 값을 변경한 후 호출한 메서드로 돌아오면 값이 바뀌게된다.

오버로딩된 메서드

  • 메서드 시그니처 : 메서드명과 입렵매개변수의 자료형
    • 메서드를 구분하는 기준
  • 메서드 시그니처가 다르면 메서드명이 동일해도 다른 메서드로 인식
  • 메서드 오버로딩 : 입력매개변수의 개수나 자료형이 다른 여러 개의 동일한 이름을 지닌 메서드를 같은 공간에 정의하는 것
  • 메서드 오버로딩
    • 리턴 타입 메서드명 (자료형 변수명, 자료형 변수명, ...) { }
    • int sum ( int a, int b) { }
    • 호출할 때 넘겨 주는 입력매개변수에 따라 호출될 메서드가 선택된다.
  • 리턴 타입으로는 메서드를 구분할 수 없다.

가변 길이 배열 입력매개변수 메서드

  • 개수가 정해지지 않은 가변 길이의 입력을 받는 입력매개변수로 입력된 값들은 배열로 저장된다. 배열의 크기는 함수 가 호출될 때 전달된 입력값의 개수로 정해진다.
  • 리턴 타입 메서드명 (자료형... 참조 변수명) { 메서드 }
    • ex) method1(1, 2) ; // 입력매개변수 길이 : 2

            method1(1, 2, 3);  // 입력매개변수 길이 : 3
      
            method1();  // 입력매개변수 길이 : 0

      public static void method1(int... values) {

      System.out.println(”입력매개변수 길이 : “ + values.length);

      for ( int i = 0; i < values.length; i ++)

      Systme.out.println(values[i] + “ “);

생성자(Constructor)

  • 반드시 클래스명과 동일해야 한다.
  • 메서드와 비슷한 구조를 지니지만, 리턴 타입이 없다.
  • 구조 : 클래스명(입력매개변수) { }
  • 생성자를 포함하지 않는 클래스에게 컴파일러가 기본 생성자를 자동으로 추가
    • 기본생성자란 입력매개변수가 없는 생성자
  • class A {
       int m;
    void work() { ... }
    A() { } // 컴파일러가 자동으로 기본 생성자 추가 }
  • 생성자가 호출되는 것만으로 객체가 내부적으로 생성되며, 생성자의 중괄호 안은 객체가 생성된 이후 할 일이 작성된다. 일반적으로 이곳에서 필드를 초기화 한다.

생성자와 객체의 생성 방법

  • 생성자의 모양에 따라 객체를 생성하는 방법이 결정된다.
  • 생성자도 메서드처럼 오버로딩 가능 → 메서드처럼 생성자의 입력매개변수 자료형이나 개수에 따라 여러개의 생성자를 정의할 수 있다.

class A {
A() {
System.out.println("첫 번째 생성자");
}
A(int a) {
System.out.println("두 번째 생성자");
}
A(int a, int b) {
System.out.println("세 번째 생성자");
}
}

public class ContstructorOverloading {
public static void main(String[] args) { // 생성자 오버로딩 후 생성자를 호출해 객체 생성
A a1 = new A();
A a2 = new A(3);
A a3 = new A (3, 5);
}
}

this 키워드와 this() 메서드

  • 모든 사용할 수있는 상태의 멤버는 항상 객체 속에만 존재한다.

내부 객체 참조 변수명인 this 키워드

  • this : 모든 메서드에서 자신이 포함된 클래스의 객체를 가리키는 참조변수
  • this를 생략하면 컴파일러가 자동으로 this.를 추가해준다.
    • int m = 3 을 클래스 내부에서 출력하려면 원래 System.out.println(this.m) 작성해야함
  • 지역변수는 멤버가 아니므로 this.가 붙지않음
  • class A {
    int m;
    
    int n;
    
    void init(int m, int n) {
    m = m; n = n; → 필드와 지역변수를 모두 사용할 수 있고 이름이 같을때 지역 변수로 인식 } }
  • A a =new A(); a.init(3, 4); System.out.println(a.m); //0 System.out.printnl(a.n); //0
  • 메서드내 필드에 this. 을 붙여야한다.

클래스 내 다른 생성자를 호출하는 this() 메서드

  • this() 메서드 → 자신이 속한 클래스 내부의 다른 생성자를 호출
  • 생성자의 내부에서만 사용 가능
  • 생성자의 첫 줄에 위치해야 한다.
  • 메서드에서는 this() 메서드 사용불가
profile
백엔드 개발자

0개의 댓글