1) 객체 지향 언어 (OOP)

object-oriented language(OOP)라고도 하며, 프로그램을 다수의 객체로 만들고 서로 상호작용 할 수 있도록 만드는 프로그래밍 언어이다. 대표적으로는 C++, 자바, 파이썬이 있다. 처음에 자바를 접했을 때 조금 어려운 부분이 많았는데(물론 여전히 배울 게 많아 여전히 어렵다) 아는 언니가 ‘로봇 팔다리 조립하는 느낌’이라고 했을 때 아! 싶더라.

객체 지향 언어의 특징 네가지는 다음과 같다.

1. 캡슐화 : 데이터와 알고리즘을 하나로 묶어 하나의 캡슐로 만드는 것
2. 상속 : 상위 클래스의 모든 것을 하위 클래스가 이어받는 것
3. 다향성 : 하나의 객체가 여러 다른 객체로 재구성 되는 것
4. 추상화 : 프로그램을 만드는 데 필요한 부분만 파악해서 추출하고, 필요하지 않은 것은 제거하는 것


2) 클래스 (Class)

클래스의 정의는 이렇다.

  1. 클래스는 변수(variables)와 메소드(method)의 집합체이다.
  2. class 아래에 있는 변수는 모든 instance에서 같은 값을 갖는다. (전역 변수)
  3. 클래스를 만든다는 것은 사용자 정의 데이터 타입을 만드는 것과 같다. 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()와 같이 사용 가능하다.

클래스 안에는 네가지가 존재 가능하다

  1. 클래스 변수(static)
  2. 클래스 메소드(static void)
  3. 인스턴스 변수
  4. 인스턴스 메소드

예제

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입니다.
이 옷의 색상은 보라색입니다.
이 옷의 색상은 하늘색입니다.