자바 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
'Etc.. > SWExpertAcademy' 카테고리의 다른 글
[Java Programming] 객체지향 핵심 원리(5) (0) | 2021.07.17 |
---|---|
[Java Programming] 객체지향 핵심 원리(4) (0) | 2021.07.17 |
[Java Programming] 객체지향 핵심 원리(2) (0) | 2021.07.13 |
[Java Programming] 객체지향 핵심 원리(1) (0) | 2021.07.12 |
[Java Programming] 자바언어의 구조와 기본문법 (4) (0) | 2021.07.11 |