객체지향
객체지향의 특성
1. 캡슐화 : 객체를 캡슐로 싸서 내부를 볼 수 없게 하는 것을 말한다.
우리가 객체를 사용하는 이유가 바로 이 캡슐화에 있으며, 따라서 이 캡슐화가 객체의 가장 본질적인 특징이다.
자바에서 클래스로 구현하는 메소드와 필드가 바로 객체의 모양을 선언하여 캡슐화 하는 것이다.
2. 상속: 부모의 속성이 자식에게 물려지는 것이다.
상위 클래스를 수퍼 클래스하고하고, 하위 클래스를 서브클래스라고 부른다.
서브 클래스는 수퍼 클래스의 특성을 그래도 물려받고, 이를 재사용하거나 새로운 특성을 추가할 수 있다.
3. 다형성 : 같은 이름의 메소드가 클래스 혹은 객체에 따라서 다르게 구현되는 것을 말한다.
다형성의 사례로는 크게 메소드의 오버로딩과 오버라이딩이 있다.
메소드 오버로딩은 한 클래스 내부에서 같은 이름이지만 다르게 작동하는 여러 메소드를 말한다.
메소드 오버라이딩은 서브클래스에서 슈퍼클래스로부터 상속받은 메소드를 다르게 구현하는 것을 말한다.
객체지향의 목적
절차지향 프로그래밍과 달리 객체지향 프로그램은 컴퓨터가 수행하는 작업을 객체간의 상호작용으로 표현한다. 따라서 객체 지향 프로그래밍은 클래스 혹은 객체들의 집합으로 프로그램을 작성한다.
따라서 객체지향언어는 소프트웨어의 생산성을 향상시키고, 소프트웨어의 생명주기를 단축한다.
또한 실세계에 대한 쉬운 모델링을 돕는다.
클래스, 객체
클래스 : 객체의 속성과 행위를 선언하는 설계도.
객체: 클래스로 찍어낸 실체. 인스턴스라고도 부른다.
클래스의 구성
이때 클래스에 대한 접근 권한과 멤버에 대한 접근지정을 하고 있다. 이는 다른 클래스에서 접근이 가능한 정도를 명시하는 것이다.
생성자
객체가 생성되는 순간에 자동 호출되어 실행되는 메소드이다. 생성자는 객체가 생성되는 순간에 초기화를 목적으로 실행된다.
생성자의 이름을 클래스와 동일하게 만들어야 한다. 또한 오버로딩을 통해 여러개의 생성자를 사용할 수 있다.
생성자의 리턴 타임은 지정할 수 없으며, void도 불가능 하다
따로 생성자를 만들지 않는다면 디폴트 생성자가 자동 생성되어 사용하게 된다.
만약 다른 생성자를 만들어두었다면 디폴트 생성자는 자동 생성 되지 않는다.
this 레퍼런스
thiis는 객체 자신에 대한 레퍼런스를 말한다. 즉, 현재 객체 자신을 가리킨다.
this.멤버 형태로 멤버에 접근할 때 사용한다.
this() 와는 다르다.
this()
this()의 경우 해당 클래스의 생성자에서 사용한다.
이때 생성자 코드의 가장 윗부분에 있어야 하고, 다른 생성자를 호출하는데에 쓰인다.
public class Circle {
int radius;
String name;
public double getArea(){
return radius*radius*3.14;
}
public Circle(String name){
this.name = name;
}
public Circle(int radius){
this("Unknown");
this.radius = radius;
}
public static void main(String[] args){
Circle pizza = new Circle(3);
double area = pizza.getArea();
System.out.println("pizza의 주인은 "+pizza.name);
System.out.println("pizza의 넓이는 "+area);
}
}
메소드
메소드는 함수와 동일하다. 자바의 모든 메소드는 클래스 내부에 있어야 한다(캡슐화 원칙)
메소드의 형식은 다음과 같다.
이때 접근 지정자는 다른 클래스에서 메소드를 접근하는 권한을 지정하는 것이다. 접근지정자를 생략할 수 있다.
인자 전달
기본타입
메소드의 인자에 기본타입이 들어가는 경우에는 값이 매개변수에 복사되어서 전달된다. 따라서 실제 인자 값은 변경되지 않는다.
객체
반면 인자로 객체가 전달되는 경우에는 객체의 레퍼런스만 복사된다. 즉, 매개변수가 실인자 객체를 공유한다.
따라서 메소드 내에서 객체를 변경하는 경우 메소드 종료 후에도 변경사항이 남아있다.
배열또한 객체이므로 동일하게 적용된다,
메소드 오버로딩
한 클래스 내부에서 두개 이상의 이름이 같은 메소드를 작성한 경우(즉,이름이 같고, 인자가 다르다) 이를 메소드 오버로딩이라 한다.
객체 치환, 소멸
가비지는 가리키는 레퍼런스가 하나도 없는 객체를 말한다. 이들은 더이상 접근 가능한 방법이 없어져 사용할 수 없다.
가비지가 된 객체의 경우에는 가비지 컬렉터에 의해 수집되고, 메모리가 자동으로 반환되어 가용메모리가 된다.
우리가 따로 free할 필요가 없다..!
특정 시점에 강제로 가비지 컬렉션을 수행하도록 하는 코드는 다음과 같다
System.gc();
패키지
상호 관련 있는 클래스 파일(.class)을 저장하여 관리하는 디렉토리를 말한다.
접근지정자
자바의 접근 지정자는 4가지로,디폴트의 경우 동일 패키지 내부의 클래스에서만 접근 가능하게 한다.
protected의 경우 해당 클래스를 상속받은 자식 클래스에 한해 추가로 접근을 허용한다.
public은 class에 관계없이 접근 허용 한다.
private은 다른 클래스가 해당 클래스에 접근 하는 것을 차단한다.
static 멤버
class에서 static멤버는 객체 생성 시 딱 한번만 생성된다. 도한 생성 이후에는 동일 class로부터 생성된 객체끼리 공유된다.
static은 따라서 전역변수, 전역함수를 만들고 싶은 경우에 사용한다. 또한 공유 멤버를 만들어 클래스의 객체 사이에서 활용할 수 있도록 한다.
Sample.m = 5;
Sample.g();
제약
메소드에서 static
- 메소드에 static을 사용한 경우 static멤버만 내부에서 사용할 수 있다. 객체가 생성되지 않은 상태(new 하지 않은 상태)에서 static메소드를 사용할 수 있기 때문이다.
- this를 사용할 수 없다. 위와 동일한 이유.
final 필드
상수를 만들 때 선언한다. 따라서 선언시 초기값을 지정해주어야 하고, 도중에 값 변경이 불가능하다