Programming Language/Java

객체(Object)(2) - 필드, 생성자, 메소드

Ma_Sand 2022. 3. 3. 13:32
반응형

1. 필드(Field)

 (1) 특징

   ① 클래스를 구성하는 요소 중 하나

   ② 클래스 내부에서 메소드 밖의 영역에 정의가 되는 지역변수의 개념

   ③ 어떠한 데이터를 저장하기 위한 역할(= 변수)

 

 

 (2) 변수의 구분

   ① 전역변수

      : 클래스 영역에 바로 선언하는 변수(클래스 내부이면 어디서든 사용할 수 있다.)

     ⓐ 멤버변수(인스턴스변수, 필드)

       - 생성 시점: new 연산자를 통해 해당 객체를 생성하는 순간에 heap 메모리 영역에 할당된다.

       - 소멸 시점: 객체가 소멸될 때 같이 소멸된다.(Garbage Collector가 지워줄 때)

     ⓑ 클래스변수(static 변수 - static이라는 예약어가 붙은 변수)

       - 생성 시점: 프로그램이 실행과 동시에 static 영역에 할당된다.

                          ∴ 해당 객체가 생성되지 않아도 무조건 프로그램 실행과 동시에 할당된다.

       - 소멸 시점: 프로그램이 끝날 때 소멸된다.

 

   ② 지역변수

      : 클래스 영역 내의 특정 구역({})에 선언하는 변수

        ex) for(int i = 0; 조건식; 증감식) {}  → 초기식에서 선언된 i는 지역변수이다.

       - 생성 시점: 특정 구역({}) 실행 시 stack 메모리 영역에 할당된다.

       - 소멸 시점: 특정 구역({}) 종료 시 소멸된다.

 

private int global;  // 전역변수(global)

public void method(int number) {  // 매개변수 = 지역변수
    int local = 0;  // 지역변수는 반드시 초기화를 해주어야 한다.
}

 

 

 (3) 접근제한자

+ public 어디서든 접근이 가능
- private 오직 해당 클래스 내에서만 접근이 가능
~ default 같은 패키지에 해당 클래스 내에서 접근이 가능
# protected 같은 패키지에 해당 클래스 내에서 접근이 가능
단, 다른 패키지에서는 상속 관계라면 접근이 가능

 

 

 (4) 클래스변수(static)와 상수 필드(static final)

   ① 클래스 변수(static)

     ⓐ 생성 시점: 프로그램 실행과 동시에 static 영역에 할당된다. (객체를 생성하지 않아도 불러올 수 있다.)

         소멸 시점: 프로그램 종료 시 소멸된다.

     ⓑ static은 프로그램 실행과 동시에 메모리 영역에 할당되므로 그 값을 "공유"하기 위해 사용된다.

접근제한자 예약어 자료형 필드명;  // 예약어는 생략 가능

public static String str = "static";

     

   ② 상수 필드(static final)

     ⓐ 한 번 지정된 값은 계속 고정해서 쓰므로 무조건 초기화해야 한다. 

     ⓑ 주의! 상수 필드명은 모두 대문자로 써야 한다.

public static final 자료형 상수필드명 = 값;
// public final static으로 사용해도 된다.(예약어의 순서 상관 없음)

public class Field {
    public static final int NUM = 10;  // 매개변수 'NUM'(대문자)
}

만약에 NUM의 값을 변경하려고 한다면?
public class run {
    public static void main(String[] args) {
        Field.NUM = 20;  // 에러 발생
    }
}
  -> NUM은 상수라서 값을 변경할 수 없다.

 

 

 

 

2. 생성자(Constructor)

 (1) 특징

   ① 메소드명이 클래스명과 동일하고, return 자료형이 없다. (반환형이 존재하지 않는다.)

   ② 객체를 생성할 때 자동으로 기본값을 넣어주는 기본 생성자를 생성하거나(객체를 생성하면 메모리 공간을

       할당받아야 하는데 heap 메모리 영역에 빈 공간이 있을 수 없기 때문), 임의로 초기값을 설정하고 싶을 때

       매개변수 생성자를 이용한다.

   ③ 객체 생성 구문에 new부터가 생성자에 해당한다. 'Company c = new Company();'

   ④ 생성자가 여러 개 존재할 수 있다.(오버로딩)

       하지만 매개변수의 자료형이나 개수, 순서가 달라야 한다.(이것들이 같으면 에러가 뜨고, 변수명이 다른 것도

       에러가 뜬다.)

   ⑤ 주의! 매개변수 생성자를 명시적으로 작성하면 JVM이 기본 생성자를 생성해주지 않으므로 항상 기본 생성자를

       만들어주어야 한다.

public 클래스명(매개변수) {  // 소괄호 안 매개변수 생략 가능
    만약에 매개변수 생성자일 경우 필드 초기화 구문이 들어간다.
    this.empId = empId;  // 매개변수 empId
}

 

 

 (2) 종류

   ① 매개변수가 있는 생성자

   ② 매개변수가 없는 기본 생성자

     → 차이점: 매개변수가 있는 생성자는 필드값을 초기화하고, 기본 생성자는 초기화하지 않는다.

 

 

 (3) 목적

   ① 객체를 생성하기 위해서 생성자를 사용한다.

   ② 객체를 생성하기 위함 뿐만 아니라 매개변수를 이용하여 전달된 값으로 필드를 초기화하기 위해 생성자를

       사용한다.

 

public class User {
    private String userId;
    private String userPw;
    private String userName;
    private String pNum;
    
    // 생성자명은 메소드명과 동일하게 User로.
    public User() {}  // 기본 생성자
    public User(String userId) {  // 매개변수가 하나인 생성자
        this.userId = userId;  // this()문을 이용하여 코드 줄이기
    }
    public User(String userId, String userPw) {  // 매개변수가 두 개인 생성자
        this(userId, userPw, null, null);  // 필드에 선언되어 있으므로 매개변수가 없는 것은 기본값
    }
    public User(String userId, String userPw, String userName) {  // 매개변수가 세 개인 생성자
        this(userId, userPw, userName, null);
    }
    
    // 필드 전체를 받는 매개변수 생성자
    public User(String userId, String userPw, String userName, String pNum) {
        this.userId = userId;
        this.userPw = userPw;
        this.userName = userName;
        this.pNum = pNum;
    }
    public String info() {  // 문자열 String으로 모든 정보를 한번에 출력
        return userId+" "+userPwd+" "+userName+" "+pNum;
    }
}

public class UserRun {  // 실행할 클래스
    public static void main(String[] args) {
        User user1 = new User();  // 기본 생성자(값이 없음)
        User user2 = new User("user123", "user11");  // userId에 user123, userPw에 user11 입력
        System.out.println(user1.info());  // info()를 user1로 호출
        System.out.println(user2.info());  // info()를 user2로 호출
    }
}

▼실행결과

null null null null  // user1의 출력값
user123 user11 null null  // user2의 출력값

 

 

 

3. 메소드(Method)

 (1) 특징

   ① 입력값으로 어떤 일을 수행한 다음, 결과를 출력한다.

   ② 예약어와 매개변수, return;(반환형이 void인 경우)은 생략이 가능하다.

   ③ 호출할 때에 매개변수의 자료형과 개수가 일치해야 한다.

   ④ 메소드를 한 번 정의해두고 필요할 때마다 사용할 수 있다.

 

 

 (2) 오버로딩(Overloading)

   ① 한 클래스 내에서 같은 메소드명으로 여러 메소드를 정의할 수 있다.

   ② 매개변수의 자료형 개수와 순서, 종류가 각각 다르게 작성되어야 한다.

   ③ 주의! 매개변수명과 접근제한자, 반환형은 오버로딩에 영향을 주지 않는다.

public void method() {  // 입력값이 없음
    System.out.println("null");
}
public void method(String pNum) {  
   // String가 추가되어 개수가 다름
}
public void method(String pNum, int num) {  
   // String은 같지만 int가 추가되어 개수가 다름
}
public void method(int num, String pNum) {  
   // 위와 비교했을 때 String, int가 있는 것은 같지만 순서가 다름
}
public void method(int pNum, String num, int cNum) {  
   // 위와 비교했을 때 String pNum이 int pNum으로, int num이 String num으로 매개변수의 자료형이 다름
   // 하지만 매개변수명은 오버로딩에 영향을 주지 않으므로 상관 없음
}
private void method(int num) {
   // 위와 비교했을 때 접근제한자가 public에서 private으로 다름
   // 하지만 접근제한자는 오버로딩에 영향을 주지 않으므로 상관 없음
}

 

반응형