1. 객체 지향 프로그래밍(OOP)
1.1 객체란?
- 물리적으로 존재하거나 추상적으로 생각할 수 있는 것 중에서 자신의 속성을 가지며 다른 것과 식별 가능한 것.
- 속성 - 필드
- 동작 - 메소드
- 현실 객체를 소프트웨어 객체로 설계 : 객체 모델링(Object Modeling)
- 현실 세계의 객체의 속성과 동작을 추려내어 소프트웨어 객체의 필드와 메소드로 정의하는 과정
1.2 객체의 상호작용
- 현실 세계에서 일어나는 모든 현상은 객체와 객체 간 상호작용으로 이루어져 있다.
- 각 객체는 독립적으로 존재하며, 다른 객체와 서로 상호작용을 하면서 동작한다.
- 객체들 사이의 상호작용 수단 - 메소드
- 객체가 다른 객체의 기능을 이용 - 메소드 호출
리턴값 = 전자계산기객체.메소드(매개값1, 매개값2, ...)
1.3 객체 간의 관계
- 객체는 개별적으로 사용될 수 있지만 대부분 다른 객체와 관계를 맺고 있음.
- 집합 관계, 사용 관계, 상속 관계
- 집합 관계 : 부품 객체와 완성품 객체
- 사용 관계
- 객체 간의 상호 작용.
- 다른 객체의 메소드를 호출하여 원하는 결과를 얻어냄.
- 사람과 자동차
- 상속 관계
- 상위 객체를 기반으로 하위 객체를 생성하는 관계
- 상위 객체 : 종류 하위 객체 : 구체적인 사물
- 기계와 자동차
객체 지향 프로그래밍(OOP: Object Oriented Programming)은 만들고자 하는 완성품인 객체를 모델링하고, 집합 관계에 있는 부품 객체와 사용 관계에 있는 객체를 하나씩 설계한 후 조립하는 방식으로 프로그램을 개발한다.
1.4 객체 지향 프로그래밍의 특징
- 캡슐화
- 상속
- 다형성
[캡슐화(Encapsulation)]
- 객체의 필드, 메소드를 하나로 묶고, 실제 구현 내용을 감추는 것.
- 외부 객체는 객체 내부의 구조를 알지 못하며 객체가 노출해서 제공하는 필드와 메소드만 이용할 수 있다.
- 필드와 메소드를 캡슐화 하여 보호
- 외부의 잘못된 사용으로 인해 객체가 손상되지 않도록 하는데 있음.
- 접근 제한자(Access Modifier) : 객체의 필드와 메소드의 사용 범위를 제한함으로써 외부로부터 보호한다.
[상속(Inheritance)]
- 부모 역할의 상위 객체와 자식 역할의 하위 객체
- 상위 객체는 자기가 가지고 있는 필드와 메소드를 하위 객체에게 물려주어 하위 객체가 사용할 수 있도록 한다.
- 상위 객체를 재사용해서 하위 객체를 쉽고 빨리 설계할 수 있도록 도와준다.
- 재사용 → 반복된 코드 중복 감소
- 상위 객체의 수정으로 모든 하위 객체들의 수정 효과
- 유지 보수 시간 최소화
[다형성(Polymorphism)]
- 같은 타입이지만 실행 결과가 다양한 객체를 이용할 수 있는 성질
- 하나의 타입에 여러 객체를 대입함으로써 다양한 기능을 이용할 수 있도록 해준다.
- 자바는 다형성을 위해 부모 클래스 또는 인터페이스의 타입 변환을 허용한다.
- 부모 타입에는 모든 자식 객체가 대입될 수 있음.
- 인터페이스 타입에는 모든 구현 객체가 대입될 수 있다.
- 객체의 부품화
- 자동차를 설계할 때 타이어 인터페이스 타입을 적용했다면, 이 인터페이스를 구현한 실제 타이어들은 어떤 것이든 상관없이 장착(대입)이 가능하다.
2. 객체와 클래스
자동차를 이용하기 위해서는 우선 공장에서 설계도를 보고 자동차를 만듦
메모리에서 사용하고 싶은 객체가 있다면 우선 설계도로 해당 객체를 만드는 작업 필요.
자바에서 설계도 → 클래스( class)
[클래스(class)]
- 객체를 생성하기 위한 필드와 메소드 정의
[인스턴스(instance)]
- 클래스로부터 만들어진 객체
- 인스턴스화 : 클래스로부터 객체를 만드는 과정
3. 클래스 선언
클래스 이름 작성 규칙
- 하나 이상의 문자로 이루어져야 한다.
- 첫 번째 글자는 숫자가 올 수 없다.
- ‘$’, ‘_’외의 특수 문자는 사용할 수 없다.
- 자바 키워드는 사용할 수 없다.
Car.java
public class Car{
...
}
class Tire{
...
{
- 두 개 이상의 클래스가 선언된 소스 파일 컴파일 시 바이트 코드 파일(.class) 클래스를 선언한 개수만큼 생긴다.
- 소스 파일은 클래스 선언을 담고 있는 저장 단위일 뿐, 클래스 자체가 아님.
- 파일 이름과 동일한 이름의 클래스 선언에만 public 접근 제한자를 붙일 수 있다.
4. 객체 생성과 클래스 변수
클래스 선언 뒤 컴파일을 했다면 객체를 생성할 설계도가 만들어진 셈
클래스로부터 객첼를 생성하는 방법 : new 연산자
new Car();
클래스 변수;
변수 = new 클래스();
- new 연산자 → 메모리 힙(heap)영역에 객체 생성, 객체의 주소 리턴
public class StudentExample{
public static void main(String[] args){
Students s1 = new Student();
System.out.println("s1 변수가 Student 객체 참조");
Student s2 = new Student();
System.out.println("s2 변수가 또 다른 Student 객체를 참조");
}
}
- Student 클래스 : 라이브러리(API: Application Program Interface)용
- main() 메소드 작성 시, 라이브러리인 동시에 실행 클래스도 가능
- StudentExample 클래스 : 실행 클래스
5. 클래스의 구성 멤버
5.1 필드
public clss Car{
String company; // 고유 데이터
String model;
String color;
int maxSpeed;
int speed; // 상태
int rmp;
Body body; // 부품
Engine engine;
Tire tire;
}
- 타입은 필드에 저장할 데이터의 종류를 결정
- 기본타입, 참조 타입 모두 올 수 있음.
- 초기값이 지정되지 않은 필드들은 객체 생성 시 자동으로 기본 초기값으로 설정
- 객체의 고유 데이터, 부품 객체, 상태 정보 저장
- 필드 vs 변수
- 변수(variable)와 선언 형태가 비슷하지만, 필드를 변수라고 부르지 않는다.
- 변수는 생성자와 메소드 내에서만 사용되고 생성자와 메소드가 실행 종료되면 자동 소멸
- 필드는 생성자와 메소드 전체에서 사용되며 객체가 소멸되지 않는 한 객체와 함께 존재.
5.2 생성자
- 생성자는 new 연산자로 호출되는 특별한 중괄호 {} 블록
- new 연산자에 의해 생성자가 성공적으로 실행되면 힙 영역에 객체가 생성되고 객체의 주소가 리턴
- 객체 생성 시 초기화 담당.
- 메소드를 호출하여 객체 사용 준비
- 메소드와 비슷하게 생겼으나, 클래스 이름으로 되어 있고 리턴 타입이 없다.
기본 생성자
- 모든 클래스는 생성자가 반드시 존재하며 하나 이상 가질 수 있다.
- 생성자 선언을 생략했다면 컴파일러는 기본 생성자를 바이트 코드에 자동 추가시킨다.
- public class로 선언 시 기본 생성자에도 public
- 클래스에서 명시적으로 선언한 생성자가 하나라도 있으면 컴파일러는 기본 생성자를 추가하지 않음
- 명시적으로 생성자를 선언하는 이유는 객체를 다양하게 초기화하기 위해서이다.
this
public Korean(String name, String ssn){
this.name = name;
this.ssn = ssn;
}
- 생성자의 매개변수 이름은 관례적으로 필드와 동일한 이름을 가지게 한다.
- 필드와 매개 변수 이름이 동일하여 생성자 내부에서 해당 필드에 접근할 수 없음.
- 동일한 이름의 매개 변수 사용 우선순위가 높기 때문
- this를 붙여 객체 자신을 참조하도록 함.
생성자 오버로딩(OVerloading)
- 생성자 오버로딩이란 매개 변수를 달리하는 생성자를 여러 개 선언하는 것.
public class Car{
Cars(){ ... }
Car(String model){...}
Car(String model, Strign color){...}
Car(String model, String color, int maxSpeed){...}
}
다른 생성자 호출(this)
public class Car{
Cars(){ }
Car(String model){
this(mdoel, "은색", 250);
}
Car(String model, Strign color){
this(mdoel, "은색", 250);
}
Car(String model, String color, int maxSpeed){
this.model = model;
this.color = color;
this.maxSpeed = maxSpeed;
}
}
'CS > 이것이 자바다' 카테고리의 다른 글
[CS] 이것이 자바다 - 클래스(3): 패키지, 어노테이션 (1) | 2023.10.04 |
---|---|
[CS] 이것이 자바다 - 클래스(2) (0) | 2023.09.21 |
[CS] 이것이 자바다 - 참조 타입 (0) | 2023.09.16 |
[CS] 이것이 자바다 - 자바, 변수와 타입 (1) | 2023.08.23 |