절차 지향 프로그래밍의 단점
- 데이터와 함수가 분리된다.
객체 지향 프로그래밍(object-oriented programming : OOP)
캡슐화 : 데이터와 코드가 하나의 묶음으로 정리되어 있다.
상속: 이미 작성된 클래스를 이어받아 새로운 클래스를 생성하는 기법 (코드의 재사용)
다형성: 객체마다 취하는 동작이 상황에 따라 달라지는 것
필드 : 객체 안의 변수
메소드 : 객체 안의 함수
객체의 소멸
객체는 생성되어서 사용되다가 소멸되어 점유하고 있던 기억 공간이 반환된다. 즉 객체에 할당되어 있던 메모리를 회수한다. 객체의 소멸을 위해서 자바에서는 garbage collection이 사용된다.
자바의 실행환경이 사용이 끝난 객체를 소멸시키고 가지고 있던 자원을 시스템에 반납한다. 객체를 가리키는 참조 변수가 존재하지 않는다면 객체의 사용이 끝났다고 판단한다.
객체가 소멸될 때 finalize( ) 메소드가 호출된다.
String 클래스
charAt(int index) | index에 있는 문자를 반환 |
compareTo(String anotherString) | 사전 순서가 더 앞이면 1, 같으면 0, 뒤면 -1 |
concat(Stirng str) | 현재 문자열 뒤에 str을 붙인 문자열을 반환 |
equals(Object object) | 주어진 객체와 현재 문자열을 비교 (true or false) |
equalsIgnoreCase(String anotherString) | 대소문자 무시하고 비교 |
isEmpty( ) | length( )가 0인지 아닌지 확인 |
length( ) | 길이 확인 |
replace(char oldChar, char newChar) | oldChar를 newChar로 변경한 문자열을 반환 |
substring(int begin, int end) | begin ~ end-1 까지의 문자열을 반환 |
toLowerCase( ) | 모두 소문자로 변경한 문자열을 반환 |
toUpperCase( ) | 모두 대문자로 변경한 문자열을 반환 |
접근자와 변경자의 사용 이유
- 설정자에서 매개변수를 통하여 잘못된 값이 넘어오는 경우, 이를 사전에 차단할 수 있다.
- 필요할 때마다 필드값을 계산하여 반환할 수 있다.
- 접근자만을 제공하면 자동적으로 읽기만 가능한 필드를 만들 수 있다.
값에 의한 전달 (Call By Value)
기초 자료형의 경우 변수의 값이 매개변수로 그대로 복사가 된다.
참조 자료형의 경우 객체의 주소가 매개변수로 복사가 된다.
가변 길이 인수
가변 길이 인수는 메소드로 전달될 인수의 정확한 개수를 알 수 없을 때 사용된다.
가변 길이 인수를 사용하려면 매개변수 타입 뒤에 ...을 붙이고 공백을 둔 뒤 매개변수를 기술한다.
ex)
void function(int... v){
...
}
정적 메소드
정적 메소드에서는 인스턴스 변수, 메소드는 사용할 수 없다.
정적 메소드에서는 정적 변수, 지역 변수, 정적 메소드를 사용할 수 있다.
main( ) 앞에 static 이 붙어 있는 이유
JVM이 객체를 생성할 필요없이 main( ) 메소드르르 호출하여 실행할 수 있도록 하기 위해서
상수는 모든 객체가 공유하는 정보이므로 정적 변수로 선언한다.
상속
상속은 이미 검증된 소프트웨어를 재사용할 수 있어서 손쉽게 개발, 유지 보수할 수 있게 해준다.
또한 코드의 중복을 줄일 수 있다.
수퍼 클래스 - 상속되는 클래스
서브 클래스 - 상속받는 클래스
서브 클래스는 수퍼 클래스의 private을 제외한 필드와 메소드를 자유롭게 사용할 수 있다.
서브 클래스는 상속된 특징들을 추가, 교체, 상세화시킬 수 있다.
서브 클래스에서 수퍼 클래스와 동일한 이름의 필드를 정의하면 서브 클래스의 필드가 수퍼 클래스의 필드를 가리게 된다. 이때 수퍼 클래스의 필드를 참조하려면 super 키워드를 사용하면 된다.
그렇지만 이렇게 동일한 이름의 필드를 사용하는 것은 피하는 것이 좋다.
자바에서는 클래스의 다중 상속을 허용하지 않고 단일 상속만 허용한다.
메소드 재정의 시 주의할 점
- 수퍼 클래스의 메소드와 동일한 시그니처를 가져야한다.
- 수퍼 클래스의 메소드가 private 메소드가 아니어야한다.
- 접근 지정자를 수퍼 클래스의 메소드보다 더 좁은 범위로 변경할 수 없다.
상속과 생성자
서브 클래스의 객체가 생성이 될 때 수퍼 클래스의 생성자가 먼저 실행되고 서브 클래스의 생성자가 실행된다.
이때 서브 클래스의 생성자에서 super( )을 이용하여 명시적으로 수퍼 클래스의 생성자를 호출할 수 있다.
super( )가 생략되었다면 자바가 자동적으로 매개변수가 없는 생성자를 추가하고 호출한다.
이때 만약 수퍼 클래스에서 생성자가 하나라도 정의되어 있는 경우에는 자동적으로 생성자를 추가하지 않는다.
따라서 수퍼 클래스에 생성자가 존재한다면 서브 클래스의 생성자에서 수퍼 클래스의 생성자를 명시적으로 사용해야한다.
추상 클래스
- 완전하게 구현되어 있지 않은 메소드를 가지고 있는 클래스
- 상속계층에서 추상적인 개념을 나타내기 위한 용도로 사용된다.
- 추상 클래스는 하나 이상의 추상 메소드를 가지고 있다. 추상 메소드는 abstract로 시작하여 ;으로 끝난다.
- 추상 클래스는 보통의 메소드도 가질 수 있다.
인터페이스
- 추상 클래스의 극단적인 예로 추상 메소드와 상수로 이루어진다. ( 필드 선언 불가)
- 모든 메소드가 추상 메소드이므로 abstract 생략 가능
- 인터페이스는 참조 변수를 정의하는데 사용될 수 있다. 이 참조 변수에 대입할 수 있는 값은 반드시 그 인터페이스를 구현한 클래스의 객체이어야한다. 이때 참조 변수를 통해서는 인터페이스에 정의된 메소드만 호출할 수 있다.
- 클래스와는 다르게 다중 상속 가능
- 여러 클래스에서 사용되는 상수들을 정의하는 용도로도 사용된다.
다형성
- 객체들의 타입이 다르면 똑같은 명령이 전달되더라도 서로 다른 동작을 하는 것
- 명령은 객체의 타입을 고려하지 않아도 된다.
- 상향 형변환: 수퍼 클래스 참조 변수로 서브 클래스 객체를 참조할 수 있다.
- 상향 형변환의 이용: 메소드 매개변수를 수퍼 클래스 타입으로 선언하여 파생된 모든 서브 클래스 객체를 받을 수 있게 한다.
- 바인딩: 메소드 호출을 실제 메소드의 몸체와 연결하는 것
- 자바에서는 실행 단계에서 객체의 타입을 보고 바인딩을 진행하는데 이를 동적 바인딩이라고 한다.
- 다형성을 사용하면 시스템에 최소한의 영향을 미치면서 새로운 유형의 객체를 쉽게 추가할 수 있다.
'Java' 카테고리의 다른 글
객체지향 설계 5원칙 SOLID (0) | 2021.11.22 |
---|
댓글