앞서 2개의 챕터에서 자바는 객체 지향 프로그래밍 언어라고 하였고 클래스와 객체에 대해 다루었다. 여기에서 클래스도 하나의 자료형 타입이라는 언급을 한 적이 있다. 이에 대해 조금 더 자세히 이야기를 해보려 한다.
자바에서는 변수를 2개의 형태로 나눌 수 있다. 하나는 Reference(참조형)이고 다른 하나는 Basic(기본형)이다. 참조형은 클래스 타입 혹은 사용자 정의 타입으로도 불리는데, 이는 객체 연결을 위한 타입이다. 만약 Car 클래스를 이용하여 객체를 생성하는 것과 동시에 필드를 초기화하는 코드를 작성한다고 하면
Car myCar = new Car("뿡뿡이", 2021);
이 될 수 있다. 여기서 Car myCar의 Car는 클래스 타입 혹은 레퍼런스 타입이고, myCar는 레퍼런스 변수라고 한다. 그렇다면 레퍼런스 변수는 기본형 변수와 어떠한 차이가 있을지 알아보자. 기본형 변수는 int, double, char 등 프로그래머가 따로 정의한 타입이 아닌 기존에 존재하는 자료형 타입으로 만들어진 변수에 해당한다. 또한, 기본형 변수의 특징은 변수가 값을 직접 저장하고 있다는 것이다. 이에 반해, 레퍼런스 변수는 클래스 타입(레퍼런스 타입)으로 작성된 것으로서 객체를 직접 저장하고 있는 변수가 아닌 객체를 참조하고 있는 변수이다. 즉, 객체의 주소를 가지고 있는 변수라는 것이다.
클래스를 작성하고 하나의 클래스로부터 생성하는 여러 객체들을 다루게 되면 static의 개념을 빼놓을 수 없다. static은 '정적'이라는 뜻인데, '공유'의 개념이 담긴 키워드이다. static은 클래스의 변수(필드) 혹은 메서드에 붙여 사용이 가능한데, 변수(필드)와 메서드에 static을 붙이게 되면 이는 클래스 변수, 클래스 메서드라고 한다. 클래스 변수와 메서드는 객체의 외부에 존재하게 된다. 반면, static이 붙지 않은 변수나 메서드들은 인스턴스 변수 or 메서드라고 한다. 이는 객체에 존재하는 것들이다. 클래스 변수 or 메서드는 외부에 존재하는 것이기 때문에 동일한 클래스로 생성한 객체라면 이를 공유할 수 있게 되는 것이다. 반대로, 인스턴스 변수 or 메서드는 객체를 생성할 때마다 새롭게 생성되는 것들이기 때문에 공유가 불가능하다. 더 쉬운 이해를 위해 예제를 통해 알아보도록 할 것이다.
객체가 생성된 개수를 파악하기 위해 static으로 int형 변수 count를 선언하였고, 객체가 생성될 때마다 count의 값이 1씩 증가하도록 count++; 작성하였다. 변수 count를 static으로 선언하였기 때문에 count가 3인 것을 알 수 있다. 위에서 static이 붙은 변수나 메서드는 클래스 즉, 객체의 외부에 위치해 있다고 하였다. 때문에, 객체를 생성하지 않아도 접근이 가능하다. 다만 클래스에 속한 것이기 때문에 13번째 줄과 동일하게 '클래스 이름. 변수 이름'으로 사용이 가능하다. 그럼 반대로 static으로 선언하지 않았을 때 어떠한 결과가 나오는지도 봐보도록 하자.
count를 non-static으로 선언하였기 때문에 'Hero.count'로 접근은 불가능하다. 또한, 결과가 달라진 것을 알 수 있다. 이렇듯 변수와 마찬가지로 static은 메서드에도 동일한 적용이 가능하기 때문에 static으로 작성된 메서드를 외부에서 접근할 때에는 '클래스 이름. 메서드 이름'으로 접근이 가능하다는 점을 알고 있으면 될 것이다.
'Java' 카테고리의 다른 글
Chapter 15 - API (0) | 2022.01.13 |
---|---|
Chapter 14 - 접근 지정자 (0) | 2022.01.12 |
Chapter 12 - 생성자 (0) | 2022.01.10 |
Chapter 11 - 객체 지향 프로그래밍(Object Oriented Programming) (0) | 2022.01.07 |
Chapter 10 - 배열 (0) | 2022.01.06 |