객체를 정의한 '설계도(blueprint)' 또는 '틀(frame)’
클래스는 객체를 생성하는데 사용되며, 반대로 객체는 클래스에 정의되고 설계된 내용 그대로 생성된다.
클래스는 객체 그 자체가 아니라 단지 객체를 생성하는 데 사용되는 하나의 틀이다.
클래스를 통해 생성된 객체
차이를 두는 것에 큰 의미 X
객체는 모든 인스턴스를 포괄하는 넓은 의미
인스턴스는 해당 객체가 어떤 클래스로부터 생성된 것인지를 강조하는 의미
class 클래스명 { // 클래스 정의
-- 생략 --
}
클래스명은 주로 대문자로 시작하는 것이 관례다.
public class ExampleClass {
int x = 10; // (1)필드
void printX() {...} // (2)메서드
ExampleClass {...} // (3)생성자
class ExampleClass2 {...} // (4)이너 클래스
}
위의 구성 요소들 중 생성자를 제외한 나머지 3가지 요소를 우리는 클래스의 멤버(member)라 부른다.
객체는 크게 속성과 기능이라는 두 가지 구성요소로 이루어져 있다.
속성과 기능은 각각 필드와 메서드로 정의되는데, 일반적으로 하나의 객체는 다양한 속성과 기능의 집합으로 이뤄져 있으며 이러한 속성과 기능은 이너클래스와 함께 객체의 멤버(member)라 부른다.
자동차를 예로들면 엔진, 바퀴 개수, 핸들, 브레이크 등이 속성에 해당하고
시동걸기,가속하기,감속하기 등이 기능에 해당한다.
객체의 생성은 다음과 같이 new 키워드를 사용하여 다음과 같이 실제 객체를 생성할 수 있으며 생성한 후에는 포인트 연산자(.)를 통해 해당 객체의 멤버에 접근이 가능하다.
class CarTest {
public static void main(String[] args) {
Car bmw = new Car(); // Car 클래스를 기반으로 생성된 bmw 인스턴스
Car tesla = new Car(); // Car 클래스를 기반으로 생성된 tesla 인스턴스
Car audi = new Car(); // Car 클래스를 기반으로 생성된 audi 인스턴스
}
포인트 연산자 .
: 해당 위치에 있는 객체 안을 보게하는 연산자
참조 변수명.필드명 // 필드값 불러오기
참조 변수명.메서드명() // 메서드 호출
클래스에 포함된 변수 (지역변수는 아니다)
class Example { // => 클래스 영역
//Field
int instanceVariable; // 인스턴스 변수
static int classVariable; // 클래스 변수(static 변수, 공유변수)
void method() { // => 메서드 영역
int localVariable = 0; // 지역 변수. {}블록 안에서만 유효
}
}
인스턴스 변수(iv)는 인스턴스가 가지는 각각의 고유한 속성을 저장하기 위한 변수로 new 생성자() 를 통해 인스턴스가 생성될 때 만들어진다.
클래스 변수는 독립적인 저장 공간을 가지는 인스턴스 변수와 다르게 공통된 저장공간을 공유한다.
(특정한 값을 공유해야하는 경우에 주로 static 키워드를 사용하여 클래스 변수를 선언)
힙 메모리에 저장되는 필드 변수는 객체가 없어지지 않는 한 절대로 삭제되는 않는 반면, 스택 메모리에 저장되는 지역변수는 한동안 사용되지 않는 경우 가상 머신에 의해 자동으로 삭제
필드변수는 자동으로 초기화
지역변수는 직접 초기화 해줘야함.(int num =0;등)
static은 클래스의 멤버(필드, 메서드, 이너 클래스)에 사용
static 키워드가 붙은 멤버 = 정적 멤버(static member)
클래스명.멤버명
만으로 사용 가능public class StaticTest {
public static void main(String[] args) {
StaticExample nostatic = new StaticExample();
System.out.println("인스턴스 변수: " + nostatic.num1); // static 키워드가 없는 인스턴스 변수
System.out.println("클래스 변수: " + StaticExample.num2); //static 키워드가 있는 클래스 변수
}
}
class StaticExample {
int num1 = 10;
static int num2 = -10;
}
//출력값
인스턴스 변수: 10
클래스 변수: -10
StaticExample nostatic = new StaticExample();
) 후 사용 가능기억하자
- 정적 필드는 객체 간 공유 변수의 성질이 있다.
- 정적 메서드의 경우 인스턴스 변수 또는 인스턴스 메서드를 사용할 수 없다.
public class StaticFieldTest {
public static void main(String[] args) {
StaticField staticField1 = new StaticField(); // 객체 생성
StaticField staticField2 = new StaticField();
staticField1.num1 = 100;
staticField2.num1 = 1000;
System.out.println(staticField1.num1);
System.out.println(staticField2.num1);
staticField1.num2 = 150;
staticField2.num2 = 1500;
System.out.println(staticField1.num2);
System.out.println(staticField2.num2);
}
}
class StaticField {
int num1 = 10;
static int num2 = 15;
}
//출력값
100
1000
1500
1500
static 키워드를 사용하면 모든 인스턴스에 공통적으로 적용되는 값을 공유하는 것을 확인할 수 있다.
특정 작업을 수행하는 일련의 명령문들의 집합, 클래스의 기능을 담당
메서드명은 관례적으로 소문자로 표시한다.
public static int add(int x, int y) { // 메서드 시그니처
int result = x + y; // 메서드 바디
return result;
}
void가 아닌 경우 반드시 return 문이 존재해야 한다.
결과값은 반드시 반환타입과 일치하거나 적어도 자동 형변환이 가능한 것이어야 한다.
메서드도 클래스의 멤버이므로 클래스 외부에서 메서드를 사용하기 위해서는 먼저 인스턴스를 생성해야한다. (static 메서드는x)
클래스 내부에 있는 메서드끼리는 따로 객체를 생성하지 않고도 서로를 호출할 수 있다.
package fortest;
public class Main {
public static void main(String[] args){
Car car1 =new Car();
Car car2 =new Car();
Car.clama();
car1.clama();
car1.insma();
}
}
class Car {
public String ins = "인스턴스 변수";
public static String cla = "클래스 변수";
public void insma(){
System.out.println(ins);
System.out.println(cla);
}
public static void clama(){
// System.out.println(ins);
System.out.println(cla);
}
}
위 경우는 괄호() 안에 넣어주는 입력 ‘인자(argument)’가 필요 없는 경우지만 만약 필요할 경우 인자의 개수와 순서는 반드시 메서드를 정의할 때 선언된 매개변수와 일치되어야 한다.
하나의 클래스 안에 같은 이름의 메서드를 여러 개 정의하는 것을 의미
public class Overloading {
public static void main(String[] args) {
Shape s = new Shape(); // 객체 생성
s.area(); // 메서드 호출
s.area(5);
s.area(10,10);
s.area(6.0, 12.0);
}
}
class Shape {
public void area() { // 메서드 오버로딩. 같은 이름의 메서드 4개.
System.out.println("넓이");
}
public void area(int r) {
System.out.println("원 넓이 = " + 3.14 * r * r);
}
public void area(int w, int l) {
System.out.println("직사각형 넓이 = " + w * l);
}
public void area(double b, double h) {
System.out.println("삼각형 넓이 = " + 0.5 * b * h);
}
}
//출력값
넓이
원 넓이 = 78.5
직사각형 넓이 = 100
삼각형 넓이 = 36.0
무조건 같은 메서드명을 사용한다고해서 오버로딩이 되는 것이 아니다.
cf) 반환 타입은 오버로딩이 성립하는 데에 영향을 주지 않는다.
클래스 = 틀
객체
인스턴스 변수 | 클래스 변수 | 지역 변수 | |
---|---|---|---|
생성 시점 | 인스턴스가 생성될 때 만들어진다 | 프로그램이 실해될 때 이미 만들어져 있다 | 함수가 호출될 때 (함수종료시소멸) |
사용 가능 시점 | 인스턴스가 생성된 후에 사용할 수 있다 | 인스턴스를 생성하기 전에도 사용할 수 있다 | 함수 내부에서만 사용 |
생성 공간 | 힙 메모리의 인스턴스 내 | 클래스 영역의 클래스 코드 내 | 스택 메모리 |
용도 | 객체의 고유한 속성 저장 | 객체 간 공유 속성 저장 | 메서드 변수 |
용어 | 설명 |
---|---|
객체 | 객체 지향 프로그램의 대상, 생성된 인스턴스 |
클래스 | 객체를 프로그래밍하기 위해 코드로 만든 상태 |
인스턴스 | 클래스가 메모리에 생성된 상태 |
멤버 변수 | 클래스의 속성, 특성 |
메서드 | 멤버 변수를 이용하여 클래스의 기능을 구현 |
참조 변수 | 메모리에 생성된 인스턴스를 가리키는 변수 |
참조 값 | 생성된 인스턴스의 메모리 주소 값 |