객체지향언어(Object Oriented Language)란?
JAVA = 객체 지향 언어
절차 지향 언어
: 실행하고자 하는 절차를 정하고, 이 절차대로 프로그래밍하는 방법 (목적을 달성하기 위한 일의 흐름에 중점을 둠)
객체 지향 언어
: 실제 세상에 가깝게 모델링하여 실제 세상의 물체를 객체로 표현하고, 객체들의 관계, 상호 작용을 설계한 뒤, 각 객체를 클래스로 작성하는 듯 객체를 만들고 프로그래밍하는 방법
객체지향언어의 특징
캡슐화 (Encapsulation)
객체를 캡슐로 감싸서 내부를 보호하고 볼 수 없게 하는 것으로 객체의 가장 본질적인 특성
상속 (Inheritance)
자식 클래스가 부모 클래스의 속성을 물려받고 기능을 추가하여 확장(extends)하는 개념
(부모 클래스 = 슈퍼 클래스 | 자식 클래스 = 서브 클래스)
다형성(Polymorphism)
같은 이름의 메소드가 클래스 혹은 객체에 따라 다르게 동작하도록 구현되는 것을 의미
→ 오버라이딩(overriding) : 슈퍼 클래스에 구현된 메소드를, 서브 클래스에서 동일한 이름으로 자신의 특징에 맞게 다시 구현하는 것
→ 오버로딩(overloading) : 클래스 내에서 이름이 같지만 서로 다르게 동작하는 메소드를 여러 개 만드는 것
객체지향언어의 목적
소프트웨어의 생산성 향상
컴퓨터 산업 발전 → 소프트웨어가 나오고 사라지는 주기가 짧아짐 → 짧은 시간 내에 소프트웨어 제작해야함
→ 이러한 목적을 충족시키기 위해, 객체, 캡슐화, 상속, 다형성 등 소프트웨어의 재사용을 위한 여러 기법들을 가진 객체 지향 언어가 탄생
실세계에 대한 쉬운 모델링
실세계의 일을 프로그래밍 해야하는 경우가 많아짐 → 이를 절차 지향 언어를 이용하여 일련의 절차로 묘사하는 것은 힘듦
→ 즉, 이런건 일과 관련된 많은 객체들의 상화작용으로 묘사하는 것(객체 지향 언어)이 더 적합
클래스와 객체
클래스: 객체를 만들어 내기 위한 설계도 혹은 특
객체: 클래스 모양 그대로 생성된 실체 ↔ 클래스의 인스턴스(instance)
클래스
- 필드(멤버 변수)
- 메소드(멤버 함수)
public class Circle { // (1) 클래스: 접근권한 클래스선언 클래스이름
public int radius; // (2) 필드
public String name; // (2) 필드
public Circle() {} // (3) 메소드
public double getArea() { // (3) 메소드
return 3.14*radius*radius;
}
}
객체 생성 (new 연산자)
public static void main(String [] args) {
Circle pizza; // (1) 레퍼런스 변수 선언: Circle객체에 대한 레피런스 변수 Pizza
pizza = new Circle(); // (2) 객체 생성: Circle 객체 생성
pizza.radius = 10; // (3) 필드(객체 멤버) 접근
pizza.name = "자바피자"; // (3) 필드(객체 멤버) 접근
double area = pizza.getArea(); // (4) 메소드(객체 멤버) 접근: pizza 면적 알아내기
}
생성자(constructor)
객체가 생성될 때 객체의 초기화를 위해 실행되는 메소드 (객체가 생성되는 순간 자동 호출)
- 생성자의 이름은 클래스 이름과 동일하다
- 생성자는 여러개 작성(오버로딩)할 수 있다.
- 생성자는 new를 통해 객체를 생성할 때 한 번만 호출된다.
- 생성자에 리턴타입을 지정할 수 없다.
- 생성자의 목적은 객체가 생성될 때, 필요한 초기 작업을 위함이다.
+ 기본 생성자 : 생성자가 하나도 없을 경우, 컴파일러가 매개변수가 없는 기본 생성자를 만들어준다
this 레퍼런스
객체 자신을 가리키는 레퍼러스 ↔ 현재 실행되는 메소드가 속한 객체에 대한 레퍼런스
int radius;
public Circle() {
this(10);
/*
* (1) this()는 반드시 생성자 코드에서만 호출 가능
* (2) this()는 반드시 같은 클래스 내 다른 생성자를 호출할 때 사용
* (3) this()는 반드시 생성자의 첫 번째 문장이 되어야 함
*/
}
public Circle(int radius) {
this.radius = radius;
}
객체 배열
자바에서 기본 타입 데이터 뿐만 아니라, 객체를 원소로 하는 객체 배열도 만들수 있다.
자바의 객체 배열 → 객체에 대한 레퍼런스를 원소로 갖는 배열
Circle [] c;
c = new Circle[5]; // Circle 객체에 대한 레퍼런스 5개 생성
for(int i=0;i<c.length;i++){ // c.length는 배열 c의 크기로서 5
c[i] = new Circle(i); // i 번째 Circle 객체 생성
}
클래스 접근 지정 / Static / Final
멤버에 접근하는 클래스 |
멤버의 접근 지정자 | |||
private | 디폴트 | protected | public | |
같은 패키지의 클래스 | X | O | O | O |
다른 패키지의 클래스 | X | X | X | O |
접근 가능 영역 | 클래스 내 | 동일 패키지 내 | 동일 패키지와 자식 클래스 |
모든 클래스 |
Static 멤버
객체를 생성하지 않고도 사용할 수 있는 멤버
하나만 생성되는 멤버로 동일한 클래스의 모든 객체들이 공유한다 (main 메소드가 실행되기 전에 생성된다)
Final
final class 클래스: 클래스를 상속받을 수 없음을 지정
final 메소드: 오버라이딩 할 수 없는 메소드임을 선언
final 필드: 상수
'프로그래밍 언어 > JAVA' 카테고리의 다른 글
[No.5] 모듈과 패키지, 자바 기본 패키지 (0) | 2023.01.04 |
---|---|
[NO.4] 상속 (0) | 2022.12.30 |
[NO.2] 반복문과 배열 그리고 예외 처리 (0) | 2022.12.29 |
[NO.1] JAVA 기본 프로그래밍 (0) | 2022.12.29 |
[NO.0] JAVA란? (0) | 2022.12.29 |