[JAVA] 객체지향언어, 클래스란?
1) 객체 지향 언어 (OOP)
object-oriented language(OOP)라고도 하며, 프로그램을 다수의 객체로 만들고 서로 상호작용 할 수 있도록 만드는 프로그래밍 언어이다. 대표적으로는 C++, 자바, 파이썬이 있다. 처음에 자바를 접했을 때 조금 어려운 부분이 많았는데(물론 여전히 배울 게 많아 여전히 어렵다) 아는 언니가 ‘로봇 팔다리 조립하는 느낌’이라고 했을 때 아! 싶더라.
객체 지향 언어의 특징 네가지는 다음과 같다.
1. 캡슐화 : 데이터와 알고리즘을 하나로 묶어 하나의 캡슐로 만드는 것
2. 상속 : 상위 클래스의 모든 것을 하위 클래스가 이어받는 것
3. 다향성 : 하나의 객체가 여러 다른 객체로 재구성 되는 것
4. 추상화 : 프로그램을 만드는 데 필요한 부분만 파악해서 추출하고, 필요하지 않은 것은 제거하는 것
2) 클래스 (Class)
클래스의 정의는 이렇다.
- 클래스는 변수(variables)와 메소드(method)의 집합체이다.
- class 아래에 있는 변수는 모든 instance에서 같은 값을 갖는다. (전역 변수)
- 클래스를 만든다는 것은 사용자 정의 데이터 타입을 만드는 것과 같다. ex)
int a, Sting b, double c
와 같이 변수를 지정할 때데이터 타입, 변수명
으로 지정하는 것처럼 아래 예제에서는Calc c1 = new Calc;
(클래스명, 변수명)
이 가능하다.
class Calc {
static double PI = 3.14; // 클래스 변수
int a, b; // 인스턴스 변수
public void set(int a, int b) {
this.a = a;
this.b = b;
}
public void sum() {
System.out.println(this.a + this.b); // 인스턴스 메소드
}
public void avg() { // 인스턴스 메소드
System.out.println((this.a + this.b) / 2);
}
}
public class ClassAndMethod {
public static void main(String[] args) {
Calc c1 = new Calc(); // 인스턴스, new 키워드를 사용한다
System.out.println(c1.PI); // 3.14
System.out.println(Calc.PI); // 3.14
c1.set(10, 20);
c1.sum(); // 30
c1.avg(); // 15
Calc c2 = new Calc();
System.out.println(c2.PI); // 3.14
c2.set(20, 40);
c2.sum(); // 60
c2.avg(); // 30
}
}
위 예제에서 static double PI = 3.14;
은 클래스 변수라고
주석 처리 해 놓은 것처럼,
static 키워드를 담고 있으면 클래스 소속의 변수이다.
즉 static 데이터타입 변수명
형식의 클래스 변수는 전역변수로,
인스턴스로나 클래스로나 모두 접근이 가능하다.
1. 인스턴스를 통해서 PI에 접근하는 방법
System.out.println(c1.PI);
System.out.println(c2.PI);
2. 클래스를 통해서 PI에 접근하는 방법
System.out.println(Calc.PI)
클래스 변수는 인스턴스를 생성할 필요가 없는 값을 클래스를 저장하고 싶은 경우나,
값의 변경 사항을 모든 인스턴스가 공유해야 하는 경우에 사용한다.
Calc c1 = new Calc();
c1.set(10, 20);
c1.sum(); // 30
c1.avg(); // 15
또 위와 같이 c1이라는 인스턴스를 만들어
c1.sum(), c1.avg()
와 같은 방식으로도 사용 가능하지만,
클래스에 직접 접근해 사용하는 방법도 가능하다. 다음 예제를 보자.
class Calc{
public static void sum(int a, int b){
System.out.println(a + b);
}
public static void avg(int a, int b){
System.out.println((a + b) / 2);
}
}
public class ClassAndMethod {
public static void main (String[] args) {
Calc.sum(10, 20); // 30
Calc.avg(10, 20); // 15
static void라는 키워드를 붙이면 sum은 클래스 메소드가 된다.
static은 클래스를 통해서 직접 접근해 실행할 수 있음을 의미한다.
그렇기 때문에 class이름.method()
와 같이 사용 가능하다.
클래스 안에는 네가지가 존재 가능하다
- 클래스 변수(static)
- 클래스 메소드(static void)
- 인스턴스 변수
- 인스턴스 메소드
예제
class Clothes {
int len;
String color;
public void leng(int len) {
System.out.println("이 옷의 총기장은 "+len+"cm입니다.");
}
public static void col(String color) {
System.out.println("이 옷의 색상은 "+color+"입니다.");
}
}
public class Main {
public static void main (String[] args) {
Clothes c1 = new Clothes();
c1.leng(60);
c1.col("보라색");
Clothes.col("하늘색"); // 클래스를 이용해서 클래스 메소드에 접근 가능
// Clothes.leng(80); // error! 클래스를 이용해서 인스턴스 변수에 접근 불가능
}
}
위 예제 결과
이 옷의 총기장은 60cm입니다.
이 옷의 색상은 보라색입니다.
이 옷의 색상은 하늘색입니다.