객체지향 프로그래밍(Object Oriented Programming)
필요한 데이터와 코드를 묶어 하나의 객체로 만들고 이 객체들 간에 상호작용을 하도록 프로그램을 만드는 방식 |
객체?
물리적으로 존재하거나 개념적인 것 중에서 다른 것과 식별이 가능한 것 |
ex. 학생, 자동차, 학과 등 |
속성(field, 필드)와 동작(메소드, method)로 구성됨 |
객체지향 프로그래밍의 특징
캡슐화(Encapsulation) | 객체의 필드와 메소드를 묶고, 내용을 외부에 감추는 것 |
상속(Inheritance) | 부모 객체에 필드/메소드를 자식 객체에게 물려주는 것 |
다형성(PolyMorphism) | 사용 방법은 동일하지만 결과가 다양하게 나오는 것 |
객체 지향 프로그래밍의 장단점
장점 | 코드 재사용성이 크게 향상됨 |
유지 보수에 용이 | |
대형 프로젝트에 적합 | |
단점 | 처리 속도가 느림 |
설계가 복잡함 | |
많은 시간 투자가 필요함 |
변외편 - 절차지향 프로그래밍
장점 | 실행속도가 현저하게 빠름(기술 순서대로 실행) |
단점 | 프로그램이 커진다면 유지 보수 어려움 |
순서가 바뀌면 결과 도출에 한계가 존재함 | |
대형 프로젝트에 적합하지 않음 |
JAVA의 클래스란?
자바 코드를 구성하는 가장 작은 단위이며, 사용자나 시스템이 정의하는 단위값 |
클래스 선언과 객체 생성
필드 | 클래스 내에 값을 저장하는 공간(변수) |
메소드 | 객체 동작으로 호출 시 실행하는 함수 |
생성자 | 클래스 이름과 동일한 이름을 갖는 특별한 종류의 메소드로 객체 생성시 자동 호출되며, 객체를 초기화하는 역할을 담당 |
필드의 초기값을 할당하지 않으면 자동으로 기본값이 초기화되며, 클래스 블록이 만들어져야 필드 선언이 가능함 |
패키지?
관련 있는 클래스 파일을 모아, 놓은 디렉터리로 비슷한 유형끼리 모아놓은 것 |
패키지의 선언은 소스파일의 최상단에 위치하며 소문자로만 작성되는 것이 관례 |
접근 제어자(Access Modeifier)
클래스나 일부 맴버(필드, 메소드)를 외부에서 접근하는 것을 제한하는 범위를 결정함 |
중요한 필드와 메서드가 외부로 노출되지 않도록 처리하기 위함 |
접근 제어자(Access Modeifier)의 종류
public | 패키지에 관계 없이 모든 클래스에서 접근이 가능함 |
protected | 같은 패키지 내의 모든 클래스에서 접근 가능(다른 패키지에서 접근이 불가함) 단, 다른 패키지에 있더라도 상속 받은 서브클래스에서는 접근 가능함. |
default | 같은 패키지 내의 모든 클래스에서 접근 가능하며, 다른 패키지에서 접근 불가함 |
private | 같은 클래스에서만 접근가능하다는 의미 |
필드와 메소드는 어떤 접근 제한자를 갖느냐에 따라 호출 가능 여부가 결정함 |
getter와 setter
public class Person {
private int age;
private String name;
public Person(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
클래스에서 필드(변수)는 private로 지정하는 것이 일반적이다. 외부에서 마음대로 데이터를 변경한다면 무결정이 깨짐 |
private로 선언하면 다른 클래스에서 접근하지 못하니까, 간접적으로 필드에 접근할 수 있도록 public 메소드를 제공한다. |
이것을 getter와 setter라고 하며, 객체지향 프로그래밍에서는 데이터의 직접적인 변경을 막고, 메소드를 통해 필드에 접근하는 것을 선호함. |
static 맴버(변수, 메소드)
객체마다 생성되는 것이 아니고, 클래스당 하나면 생성됨 |
클래스가 생성되는 순간에 메모리를 할당 받음 |
즉, 객체를 생성하지 않아도 static 맴버에 접근이 가능하며 동일한 클래스의 모든 인스턴스에 공유됨 |
non-static의 경우 객체가 생성될 때마다 맴버 공간을 만드니, 메모리 공간이 공유되지 않음 |
static 맴버 변수의 활용
보통의 static 변수는 공유의 목적으로 많이 사용되며 주로 유틸리티성 메소드를 사용할 때 많이 사용됨 |
객체가 생성되지 않은 상태에서 non-static 맴버는 만들어져 있기 때문에 static으로 설정된 메소드에서는 non-static 맴버에는 접근할 수 없음 |
반대로, non-static 메소드에서 static 맴버에서 접근할 수 있음 |
static 메소드에서는 this 키워드 사용 불가함 |
final 필드란?
인스턴스 필드, 정적 필드는 언제든지 값 변경이 가능하지만 final 필드는 읽기만 허용할 수 없음 |
상수 선언
상수는 객체마다 저장할 필요가 없고, 단 한번 만 같이 선언되면 되기에 static이면서 final인 특성을 가짐 | |
대문자로 작성하는 게 관례이며, 여러 단어를 사용한다면, 언더스코어(_)를 이용해 연결됨 |
클래스의 상속(Inheritance)
부모 클래스에서 정의된 필드와 메소드를 자식 클래스가 물려 받는 것 |
프로그래밍에서는 자식 클래스가 어떤 부모로부터 상속 받을 것인지를 선택 |
Java는 다중 상속을 허용하지 않으며, 상속 받을 수 있는 부모는 딱 하나 |
상속의 종류
맴버의 중복 작성 제거 |
클래스 수정 최소화 |
클래스의 계층적 분류 가능 |
클래스의 재사용과 확장성 용이 |
상속에서의 부모 생성자의 호출
모든 객체는 생성자를 호출해아먀 생성되며, 부모 클래스의 생성자를 super함수를 통해 호출하지 않으면 부모의 기본 생성자가 자동으로 호출되게 됨. |
메소드 오버라이딩이란?
부모(슈퍼) 클래스의 메소드를 자식(서브) 클래스에서 재정의하는 것 |
단, 메소드의 이름, 매개변수 타입 및 개수, 리턴 타입이 동일해야 함 |
@Override라는 어노테이션으로 상속인지 여부를 표시해둘 수 있음 |
'국비지원 공부 정리 > Java' 카테고리의 다른 글
Wrapper 클래스 - 기본 변수를 포장 (0) | 2025.04.09 |
---|---|
추상 클래스와 인터페이스 (0) | 2025.04.08 |
JAVA 예외처리 (0) | 2025.04.08 |
자바의 반복문 (0) | 2025.04.05 |
Arrays 클래스와 ArrayList (0) | 2025.04.05 |