class는 객체지향언어에서 핵심적으로 사용하는 기능 중 하나라고 할 수 있다.
class는 무엇인가 ?
class는 하나의 "물건" 이라고 할 수 있으며 java에서 모든 코드는 class안에서 존재해야한다.
class Calculator {
int left, right;
public void setOprands(int left, int right) {
this.left = left;
this.right = right;
// this.left -> "Calculator 안에서" 선언된 left
// left -> 매개변수
}
public void sum(){
System.out.println(this.left + this.right);
}
public void avg(){
System.out.println( (this.left + this.right) / 2);
}
}
그럼 class와 method의 차이점은 무엇일까?
간단하게 method는 class의 기능이라고 생각하면 간단하다.
class -> 계산기
method -> 더하기, 빼기, 곱하기 등등...
그럼 위 class와 method 는 어떻게 사용할까?
아래의 코드 예시를 통해 인스턴스 개념도 함께 알아 볼 수 있다.
public class _04_ {
public static void main(String[] args) {
Calculator c1 = new Calculator();
// new Calculator() : Calculator 객체를 새로 만들어 c1에 담음, ( c1은 타입은 new 객체와 동일해야합니다. - 해당 객체만 품을 수 있음 )
// 인스턴스 : c1에 담겨있는 실제 객체의 내용, 구체적인 객체
c1.setOprands(10, 20); // c1안에는 Calculator 객체가 들어있고, setOprands 메소드에 10, 20 매개변수 적용
c1.sum(); // 30
c1.avg(); // 15
Calculator c2 = new Calculator(); // new 연산자를 통해 새로운 인스턴스 (c1, c2 ... ) 를 담아 언제든지 sum, avg 메서드를 호출해서 원하는 작업이 가능합니다.
c2.setOprands(20, 40);
c2.sum();
c2.avg();
}
}
클래스 : Calculator();
인스턴스 : c1, c2
그럼 왜 class와 instance는 왜 구분하고 어떻게 선언할까?
class 안에 매우 많은 method가 있다고 가정해보자.
이때 전역적으로 공통적으로 사용되는 변수와 해당 기능에서만 사용하는 변수를 구분하기 위해 사용할 수 있다.
( scope 개념이 들어가는데 해당 내용은 scope 게시글에서 자세히 알아보자 )
그래서 아래와 같이 정리할 수 있다.
클래스 변수 : 클래스가 가지고 있는 변수를 모든 인스턴스에서 받아서 사용 가능 -> 인스턴스 메소드에 접근 불가능
인스턴스 변수 : 인스턴스마다 다른 값을 가지는 변수 -> 클래스 메소드에 접근 가능
아래 예시 코드를 천천히 보면 이해할 수 있을 것이다.
package lifeCoding_02_member;
// 인스턴스 변수 -> Non-Static Field
// 클래스 변수 -> Static Field
// 클래스 메소드에서는 인스턴스 변수에 접근 할 수 없다.
// 인스턴스 메소드에서는 클래스 변수에 접근 할 수 있다.
class C1{
static int static_variable = 1; // 클래스 변수 ( static 변수 )
int instance_variable = 2; // 인스턴스 변수 ( static 없음 )
static void static_static(){ // 클래스 메소드가 클래스 변수를 호출
System.out.println(static_variable);
}
static void static_instance(){ // 클래스 메소드가 인스턴스 변수를 호출
// 클래스 메소드에서는 인스턴스 변수에 접근 할 수 없다.
// System.out.println(instance_variable);
}
void instance_static(){
// 인스턴스 메소드에서는 클래스 변수에 접근 할 수 있다.
System.out.println(static_variable);
}
void instance_instance(){
System.out.println(instance_variable);
}
}
public class _04_ {
public static void main(String[] args) {
C1 c = new C1();
// 인스턴스를 이용해서 정적 메소드에 접근 -> 성공
// 인스턴스 메소드가 정적 변수에 접근 -> 성공
c.static_static(); // 1
// 인스턴스를 이용해서 정적 메소드에 접근 -> 성공
// 정적 메소드가 인스턴스 변수에 접근 -> 실패
c.static_instance(); // 에러 발생, static 메소드에서 instance 변수에 접근할 수 없다.
// 인스턴스를 이용해서 인스턴스 메소드에 접근 -> 성공
// 인스턴스 메소드가 클래스 변수에 접근 -> 성공
c.instance_static(); // 1
// 인스턴스를 이용해서 인스턴스 메소드에 접근 -> 성공
// 인스턴스 메소드가 인스턴스 변수에 접근 -> 성공
c.instance_instance(); // 2
// 클래스를 이용해서 클래스 메소드에 접근 -> 성공
// 클래스 메소드가 클래스 변수에 접근 -> 성공
C1.static_static(); // 1
// 클래스를 이용해서 클래스 메소드에 접근 -> 성공
// 클래스 메소드가 인스턴스 변수에 접근 -> 실패
C1.static_instance(); // 에러 발생
// 클래스를 이용해서 인스턴스 메소드에 접근 -> 실패
// C1.instance_static(); // 에러 발생
// 클래스를 이용해서 인스턴스 메소드에 접근 -> 실패
// C1.instance_instance(); // 에러 발생
}
}
'Java' 카테고리의 다른 글
Java - 상속 ( Inheritance ) (0) | 2023.05.04 |
---|---|
Java - scope (0) | 2023.05.04 |
Java - Method 사용하기, OverLoading(오버로딩) (0) | 2023.05.04 |
Java - 배열 (0) | 2023.05.04 |
Java - 반복문 (0) | 2023.05.04 |