객체 지향 프로그래밍에서는 모든 데이터를 객체(object)로 취급하며, 이러한 객체가 바로 프로그래밍의 중심이 된다.
객체(object)란 실생활에서 우리가 인식할 수 있는 사물로 설명할 수 있다. 이러한 객체의 상태(state)와 행동(behaivor)을 구체화하는 형태의 프로그래밍이 바로 객체 지향 프로그래밍이다. 이때 객체를 만들어 내기 위한 설계도와 같은 개념을 클래스(class)라고 한다.
자바에서 클래스(class)란 객체를 정의하는 틀 또는 설계도와 같은 의미로 사용된다.
자바에서는 이러한 설계도를 가지고, 여러 객체를 생성하여 사용하는 식으로 프로그래밍을 이어나간다.
클래스는 객체의 속성 변수를 나타내는 필드(field)와 객체의 함수를 나타내는 메소드(method)로 구성되어있다.
자바에서 클래스를 사용하기 위해서는 우선 해당 클래스 타입의 객체(object)를 선언해야 한다. 이렇게 클래스로부터 객체를 선언하는 과정을 클래스 인스턴스 화라고 한다.
또한, 이렇게 선언된 해당 클래스 타입의 객체를 인스턴스(instance)라고 한다. 즉, 인스턴스란 메모리에 할당된 객체를 의미한다.\
// 클래스
class Animal { ... }
public class Sample {
public static void main(String[] args) {
// 변수 cat은 객체
// 변수 catd은 Animal 클래스의 인스턴스
Animal cat = new Animal(); // 클래스라는 설계도를 통해 객체 데이터를 new 생성
}
}
자바에서 클래스는 멤버(member)로 속성을 표현하는 필드(field)와 기능을 표현하는 속성을 표현하는 필드(field)와 기능을 표현하는 메소드(method)를 가진다.
그 중에서 메소드(method)는 어떤 특정 작업을 수행하기 위한 명령문의 집합이라고 볼 수 있다.
클래스를 가지고 객체를 생성하면, 해당 객체는 메모리에 즉시 생성된다. 하지만 이렇게 생성된 객체는 동시에 인스턴스 변수를 원하는 값으로 초기화할 수 있는 생성자(constructor)라는 메소드를 제공한다. 자바에서 생성자(constructor)의 이름은 해당 클래스의 이름과 같아야 한다.
즉, Car 클래스의 생성자는 Car()가 된다.
자바에서 패키지란 클래스와 인터페이스의 집합을 의미한다.
서로 관련있는 클래스나 인터페이스를 함께 묶음으로써 파일을 효율적으로 관리할 수 있게 된다. 또한 협업 시 서로 작업한 클래스 사이에서 발생할 수 있는 이름 충돌 문제까지도 패키지를 이용하면 피할 수 있게 된다.
package com.oracle.util; // 해당 클래스가 속해있는 패키지 선언하여 그 패키지에 들어있는 다른 클래스들도 따로 선언없이 바로 사용 가능
// 클래스파일명
public class Sample {
}
import 문은 자바 컴파일러에 코드에서 사용할 클래스의 패키지에 대한 정보를 미리 제공하는 역할을 한다. 따라서 import 문을 사용하면 다른 패키지에 속한 클래스를 패키지 이름을 제외한 클래스 이름만으로 사용가능하게 된다.
//import문의 선언
import 패키지이름.클래스이름;
import 패키지이름.*;
//예시
import java.*; //틀린예시
import java.awt.*;
import java.util.*;
객체지향에서 정보은닉(data hiding)이란 사용자가 굳이 알 필요가 없는 정보는 사용자로부터 숨겨야 한다는 개념이다. 만일 어떠한 변수로 프로그래밍 동작이 결정된다 라고 하면, 외부 사용자가 이 변수로 접근해서 값을 바꾼다는 행위를 철저히 봉쇄 해야 한다. 안 그러면 프로그램이 망가질 수 있기 때문이다.
따라서 접근 제어자는 외부로부터 데이터의 보호가 필요하고 사용자가 사용하는데 필요없는 로직들을 숨기기 위해서 사용된다고 보면된다.(이러한 것을 은닉화/캡슐화 라고 한다.)
private
: 같은 클래스 내에서만 접근 가능default
: 같은 패키지 내에서만 접근이 가능protected
: 같은 패키지 내에서, 그리고 다른 패키지의 자손클래스에서 접근이 가능public
: 제한이 없음getter와 setter는 private를 관리하는 메서드이다.
private으로 선언하고 나서 다른 클래스에서 접근하려면 해당 클래스 안의 메서드를 통해서만 접근이 가능한데 그 관리하는 메서드를 getter와 setter라고 부른다
class A {
private int num = 10;
//getter
public int getNum() {
return a;
}
//setter
public void setNum(int a) {
this.a = a;
}
}
private 변수를 다른 클래스에 꺼내는 메서드는 get + 변수명(첫글자 대문자)
private 변수에 다른 값을 초기화하는 메서드는 set + 변수명(첫글자 대문자)
이런식으로 이름에 규칙을 짓고 해당 메서드를 getter,setter 라고 부른다.
//예시
class Car {
// 클래스 필드(static 변수) : 한 클래스에서 공통적으로 사용 되는 변수
static int var;
// 클래스 메소드(static 메소드)
static void func() {
// static 메소드에서는 this 키워드 사용 불가능. (this는 인스턴스 멤버에 대한 접근 키워드 이니까)
}
}
Car.var; // 클래스명.멤버명 으로 바로 접근됨
Car.func();
공간적 특성 : 멤버는 객체마다 별도로 존재한다.
인스턴스 멤버라고도 부른다.
시간적 특성 : 객체 생성시에 멤버가 생성된다.
공유의 특성 : 공유되지 않는다.
공간적 특성 : 멤버는 클래스당 하나가 생성된다.
시간적 특성 : 클래스 로딩 시에 멤버가 생성된다.
공유의 특성 : 동일한 클래스의 모든 객체들에 의해 공유된다.