본문 바로가기

Etc../SWExpertAcademy

[Java Programming] 객체지향 핵심 원리(3)

자바 Modifier와 생성자

■ 자바의 Modifier

static 예약어

  • 멤버 변수와 메서드 앞에 붙일 수 있는 modifier, 활용 방법을 제어함
  • 인스턴스 변수 : static 예약어 X, 생성된 인스턴스마다 그 안에 클래스의 인스턴스 변수들이 포함됨
  • 클래스 변수 : static 예약어 O, 클래스로부터 생성된 인스턴스에 포함되지 않는 변수, 많은 인스턴스를 생성하더라도 메모리에 하나의 변수만 존재함, 객체를 생성하지 않고도 접근할 수 있는 변수.

동일한 정보를 가지고 있는 경우 인스턴스 변수로 선언하면 객체가 생성될 때 마다 인스턴스 변수가 포함 될 것,

하지만 클래스 변수로 선언하면 하나의 메모리로부터 값을 참조하기 때문에 메모리 낭비가 덜하다.


  • 클래스 메서드 : 일반 메서드에 static 예약어를 사용한 것. 인스턴스를 생성하지 않아도 사용 가능

ex) Integer.parseInt() -> 클래스 변수나 클래스 메서드는 클래스명을 이용해서 접근 가능.

클래스 메서드 안에서는 클래스 메서드만 호출 가능.

class Dice{
    public static int dotCount = 5; // 클래스 변수 선언
    public int rollingCount = 0;     //인스턴스 변수 선언

   public int rollingDice(){
       int generatedNum = (int)(Math.random()) * 6) +1;
       return generatedNum;
    }

    public static void playGame(){
        dotCount++;    //클래스 변수는 클래스 메서드에서 접근 가능.
        rollingCount++; //인스턴스 변수는 클래스 메서드에서 접근 불가
        System.out.println("생성된 숫자: "+ rollingDice()); 
                                    // 일반 메서드는 클래스 메서드에서 호출 불가
    }

    public class StaticMethodTest{
        public static void main(String[] args){
            Dice.playGame(); // 메인 메서드는 클래스 변수이므로 클래스명을 통해 클래스메서드 호출 가능
        }
    }


}



final 예약어

final이 붙은 변수는 단 한 번 초기화 할 수 있고 이후에는 값을 변경할 수 없음 (a.k.a 상수)

클래스 변수는 공통된 값을 가지는 변수를 클래스 변수로 선언하여 메모리를 효율적으로 사용하는 것.

클래스 변수를 변경할 수 있도록 하용하면 staic 예약어의 의미가 상실되므로 final 예약어를 결합해 사용


상수의 이름은 일반 인스턴스 변수와 구분하기 위해 모두 대문자로 선언

여러 단어가 결합된 경우 _로 구분 ex) companyName -> COMPANY_NAME


final이 붙은 메서드는 Overriding을 금지함 ( 메서드 재정의 불가 )


final이 붙은 클래스는 상속을 금지함.



abstract 예약어

클래스에 사용 -> 추상 클래스로 선언

메서드에 사용 -> 추상 메서드를 정의


추상 메서드

returnType name([argType argName, ...]){...}   // 일반 메서드
abstract returnType name([argType argName, ...]) // 추상메서드
  • 추상메서드는 구체적인 행위를 표현하는 블록을 생략함
  • 메서드의 기본 형식인 리턴 타입, 메서드명, 매개변수가 선언되어 있어 기본적인 기능 유추 가능

추상 클래스

  • 추상 메서드를 포함하면 추상 클래스로 선언해야함.

  • 추상메서드가 존재하면 재정의해야 사용 가능하기 때문.



■ 생성자(Constructor)

생성자 개요

  • 생성자는 클래스로부터 객체를 생성할 때 호출
  • 객체의 멤버변수를 초기화하는데 사용되는 메서드
  • 객체 생성 및 생성된 객체에 필요한 데이터를 초기화하는 과정을 단순화하여 코드의 양을 줄이는 역할 수행
public class constructorTest{
    class Employee{
        String name;
        int number;
        int age;
        String title;
        String dept;
        String grade;
    }
    public static void main{String[] args}{
        Employee kim = new Employee();        //객체를 생성하고 초기화 하는 작업이 번거로움
        kim.name="홍길동";
        kim.number = 1234;
        .
        .    
        .        
    }
}
public class constructorTest{
    class Employee{
        String name;
        int number;
        int age;
        String title;
        String dept;
        String grade;
    }

    public Employee(String n1, int n2, int a, String t, String d, String g){
        name = n1;
        number = n2;
        age = a;
        title = t;
        dept = d;
        grade = g;
    }

    public static void main{String[] args}{
        Employee kim = new Employee("홍길동",1234,30,"과장","개발부","B+"); 
    }
}
  • 생성자를 적용하면 초기화가 매우 간편해짐
  • 반환형이 없음 (void도 허용되지 않음)
  • 매개변수를 달리하여 중복정의(Overloading)할 수 있음
  • 생성자는 키워드 'new'와 항상 같이 사용됨. ( 객체를 생성할 때 사용되기 때문에 "new 생성자()"와 같은 구문으로 호출)
  • 명시적으로 작성하지 않을경우 기본생성자 제공
  • alt + shift + s -> Generate Constructor using Fields 항목으로 생성자 정의 가능

this의 의미와 사용법

멤버변수와 매개변수의 이름이 동일하면 매개변수로 받은 값을멤버 변수에 할당할 수 없음.

이 때 객체 변수 이름 앞에 this를 사용하여 구별함

public class Employee{
    String name;
    int number;

    public Employee(String name, int age){
        this.name = name;        //this.name은 현재 생성된 객체의 멤버 변수를 의미함
        this.age = age;
    }
}

멤버변수와 매개변수의 이름을 구분하여 프로그램의 가독성을 높임

[참고] : SWExpertAcademy