December 31, 2020
절차지향 프로그래밍이 주였던 환경에서 모듈화된 소프트웨어의 필요성 대두 → 객체지향 프로그래밍 등장
현실 세계에 존재하는 유/무형의 모든 것
접근 권한
public
: 모든 클래스에서 접근 가능protected
: 동일 패키지에 속하는 클래스와 하위 클래스 관계의 클래스에 의해 접근 가능private
: 변수가 선언된 클래스 내에서만 접근 가능(default)
: 선언된 클래스와 동일 패키지 내에서 접근 가능활용 방법
final
: 변수를 상수로 이용하는 경우static
: 클래스에 소속된 클래스 변수를 의미, 일반적으로 클래스 변수라고 함예시
public int sum(int num1, int num2){
int sum = 0;
sum = num1 + num2;
return sum;
}
접근 권한
public
: 모든 클래스에서 접근 가능protected
: 동일 패키지의 클래스, 하위 클래스에서 접근 가능private
: 클래스 내에서만 접근 가능활용 방법
final
: Overriding 불가능한 메소드임을 의미static
:클래스에 소속된 클래스 메소드를 의미, 클래스 생성 시 만들어진다.abstract
: 추상 메소드를 의미, 하위 클래스에 의해 구현된다.synchronized
: Thread 동기화를 위한 메소드현실 세계의 객체를 프로그램에서 이용할 수 있는 객체로 변환하는 것. 즉, 클래스는 현실 세계의 객체를 컴퓨터 메모리에 생성할 수 있는 템플릿
[access modifier] class 클래스명 [extends 부모 클래스명]{ // 클래스 선언부
// 클래스 몸체
[access modifier] 클래스명(argument list){} // 생성자(constructor), 클래스명과 이름이 같은 메소드로 클래스로부터 객체를 생성할 때 사용함
[access modifier] 데이터 타입 변수명 [=초기값]; // 변수 선언
[access modifier] return_type 메소드명(argument list){} // 메소드 선언
}
public
- 모든 클래스에서 접근이 가능한 클래스임을 의미, private, protected, (default)
final
- 자식 클래스를 가질 수 없는 클래스 임을 의미, abstract
- 객체 생성이 불가능한 추상클래스를 의미, static, transient, native
, ..etc.접근 권한과 관련된 Modifier를 지정하지 않으면, 같은 패키지 내의 클래스에서만 접근 가능하다. 서로 다른 패키지의 클래스에 접근하기 위해서는 public
으로 지정해야한다.
Car Yellow = new Car(); // 클래스 이름 객체참조변수이름 = new 클래스이름();
컴퓨터 메모리에 존재하는 객체로 클래스로부터 생성된 메모리 상의 객체라고 할 수 있다.
현실 세계의 객체를 클래스라는 템플릿을 통해 인스턴스로 만듦. 따라서 객체와 인스턴스를 동일안 것으로 간주할 수 있다.
static
예약어
static
이 붙지 않는 인스턴스 변수
static
이 붙는 클래스 변수
static
이 붙는 클래스 메소드
final
예약어final
이 붙은 변수는 한 번 초기화하면 그 이후에 값을 변경할 수 없다.
👉 클래스 변수를 선언할 때, 만약 변수의 값을 변경할 수 있도록 허용한다면 static
예약어의 의미가 상실되기 때문어 final
예약어를 결합하여 사용해 초기화된 값을 변경할 수 없게 한다.
👉 클래스 메소드를 선언할 때, final
예약어를 사용하여 메소드 오버라이딩을 막을 수 있다.
👉 클래스를 선언할 때 final
예약어를 사용하여 상속을 금지할 수 있다.
abstract
예약어 추상 클래스/메소드를 정의한다는 의미로 메소드 시그니처만 정의되고 구체적인 행위는 정의되지 않는 메소드를 의미한다.
abstract returnType name([argType argName, ...]);
추상 메소드를 포함하고 있는 클래스는 추상 클래스로 표현되어야 한다. 물론 추상 메소드를 포함하지 않은 클래스도 추상 클래스로 표현 가능
abstract class SuperClass{
public void methodA(){
System.out.println();
}
public abstract void methodB();
}
class SubClass extends SuperClass{
//부모 클래스에 추상 메소드가 있기 때문에 자식 클래스도 추상 클래스로 바꾸지 않고
//일반 클래스에서 오류 없이 상속을 받기 위해서는
//부모 클래스의 추상 메소드를 오버라이딩 해야한다
public void methodB(){
System.out.println();
}
}
상속을 통해 객체들 사이의 계층 구조를 이룰 수 있다. 상위 계층으로 갈수록 일반화, 보편화된 클래스들이고 하위 계층으로 갈수록 특수화, 개별화된 클래스들이다.
public class Car{
String name;
int currentGear;
}
public class Taxi extends Car{ //extends 예약어를 통해 Car 클래스의 변수, 메소드를 모두 물려받았다.
int fare;
}
한 클래스 안에 같은 이름의 메소드를 여러 개 정의하면서, 인자의 개수나 유형을 다르게 해 놓은 형태
오버로딩 | 오버라이딩 |
---|---|
같은 이름의 메소드끼리 인자의 개수/유형이 다름 | 같은 이름의 메소드(상위, 하위)가 완전히 똑같음 |
객체지향 언어에서는 캡슐화된 변수나 메소드를 선택적으로 공개하거나 숨길 수 있다. Using private
: 비공개 정보, public
: 공개 정보
private
로 선언해서 외부에서는 숨겨진 형태로 만드는 것이 일반적이다.public
으로 지정한 메소드를 통해 접근하도록 클래스를 구현한다.
🗝 위의 두 가지가 정보은닉의 기본 get____()
: Getter 메소드
set____()
: Setter 메소드
new
와 항상 같이 사용된다.this
예약어를 사용