브래의 슬기로운 코딩 생활
JAVA 프로그래밍 5주차 정리 본문
클래스와 객체
객체(object)
- 실제로 존재하는 구체적인 대상이고, 다른 객체와 구분되는 고유성을 지니며, 특징과 행동을 갖는 프로그램 실행 주체
클래스(class)
객체의 특징과 행위를 정의하는 프로그램 구성 요소, 동일한 유형의 객체를 추상화시킨 것
- 재사용성(reusability), 이식성(portability), 유연성(flexibility)을 높여줌
- 객체의 유형, 객체를 정의하는 템플릿이라고도 함
객체와 클래스의 관계
“객체는 클래스의 인스턴스(instance)”
- 설계도와 생산 공정은 각 부품이 그 특징과 기능을 정의하지만, 실제 조립되어 동작하는 것은 부품이다.
- 객체지향 프로그래밍에서도 클래스는 객체의 특징과 기능을 정의하지만, 실제 동작하는 것은 객체들이다.
인스턴스화(instantiation)
- 클래스로부터 실제 객체를 생성하는 행위 또는 작업
객체지향의 주요 특징
캡슐화(Encapsulation)
What
- 객체를 속성(상태)과 행위를 묶어서 하나의 요소로 처리하는 것
- 소프트웨어 컴포넌트 구현에 관한 내부적인 상세사항을 감추는 것
- 프로그래머는 밖에서 보이는 추상적인 인터페이스만을 생각하면 됨
Why
정보은닉(Information Hiding)
- 객체의 속성 및 행위에 대한 접근을 제한 하여 불필요한 정보의 유출을 방지 할 수 있음
유지보수가 용이함
- 절차지향 또는 구조적 프로그래밍에서는 데이터와 연산을 각각 정의하기 때문에 유지보수가 어려움
상속(Inheritance)
What
두 클래스간의 관계로 기존의 클래스로부터 새로운 클래스를 생성하는 것
- 새로운 속성이나 연산을 추가
- 기존 속성이나 연산을 재정의
Why or benefit
- 재사용성의 증가
- 검증된 코드 사용으로 오류 최소화
다형성(Polymorphism)
What
객체의 종류에 따라 (전달되는 메시지가 동일하더라도) 다른 연산을 수행하도록 하는 것
예)
- human.run() / fish.run()
- pay(major) / pay(minor)
- 클래스 형변환, 오버로딩과 연관이 많음
Why or Benefit
- 프로그램 확장성 및 유지보수성 증대
클래스 선언
구문 구조(syntax)
[<classModifiers>] class <ClassName>
[extends <SuperclassName>]
[implements <InterfaceName1>, …]
{
// instance variable declarations
[<fieldModifier>] <variableDeclarations>
// methods declarations
[<methodModifier>] <methodDeclarations>
{ <methodBody> }
}
<classModifier>
- public : 다른 패키지에서도 접근 가능한 클래스 선언
- final : 최종 클래스 선언, 상속 불가능 클래스 선언
- abstract : 추상 클래스 선언
- strictfp (Java 1.2에 도입 17부터 제거)
▪ 클래스 내부에 정의된 메소드와 변수초기화를 FP-strict expression으로 처리
<fieldModifier>
- private : 정의된 클래스 내에서만 접근 허용
- protected : 정의된 클래스, 같은 패키지, 상속관계가 있는 경우 접근을 허용
- public : 모든 클래스의 접근을 허용
- static : 정적 메모리에 상주, 정적 변수, 클래스 변수라고 함
- final : 값을 변경할 수 없음, 선언시 반드시 초기값을 지정해야함
- transient : 객체 직렬화 시 지정된 변수는 제외함
- volatile : 상수전파와 같은 최적화 방지
<methodModifier>
- private, protected, public
- abstract : 선언만 있고, 몸통은 없는 메소드 선언
- static : 메모리에 상주하는 메소드 선언
- final : 상속 시 수정 불가능한(재정의 불가능) 메소드 선언
- synchronized : 동기화 메소드 선언
- native : 다른 프로그래밍 언어로 쓰여진 구현 부분을 이용할 때 사용
- strictfp : 메소드를 FP-strict expression으로 처리
static modifier
한 클래스로부터 생성된 객체들이 공유해서 사용하는 메소드 또는 필드를 선언할 때 사용
final modifier
수정이 불가능한 필드 또는 메소드를 선언할 때 사용, 상속할 때 수정, 재정의 될 수 없음
static final
메모리에 상주하고 수정이 불가능하며, 한 클래스로부터 생성된 객체들이 공유해서 사용하는 필드 선언에 사용
메모리에 상주하는 한 클래스로부터 생성된 객체들이 공유해서 사용하는 메소드 선언에 사용
클래스 상세 구성
공통적인 요소들
변수(인스턴스 변수, 클래스 변수) 선언
생성자 정의
- 클래스 이름과 이름이 같은 메소드로 반환 유형이 없음
- signature(이름, 매개변수 개수, 매개변수의 자료형)에 따라 식별됨
접근 메소드 정의
- getter, setter, 범위 확인 등
커스텀 메소드 정의
선언 가능한 변수의 종류
지역 변수
- 메소드 내부 또는 블록 내부에서 선언된 변수
- 사용 메모리 : 스택
- 초기화해서 사용해야 함, 초기화하지 않는 경우 오류 발생
객체 변수, 인스턴스 변수
- 객체의 속성을 나타내는 변수
생성된 객체마다 다른 값을 가질 수 있음
- 사용 메모리 : 힙
- 초기화하지 않는 경우 기본값으로 초기화됨
클래스 변수
- 사용 메모리 : 정적 메모리
- static으로 지정한 변수
- 해당 클래스로부터 생성된 객체들이 공유함
생성자(constructor)
객체를 생성할 때 초기화를 위해 컴파일러에 의해 자동으로 호출되는 메소드
특징
- 생성자 이름은 클래스 이름과 동일하고, 반환값은 없으며, public 접근 가능함
- 생성자가 없는 경우 컴파일러는 매개변수가 없는 생성자(디폴트 생성자)가 있는 것으로 간주함
- 하나의 클래스에 다수의 생성자가 존재할 수 있음, 이를 생성자 오버로딩 (overloading)이라고 함
- 생성자가 다수인 경우 컴파일러는 signature로 식별함
접근 메소드(getter/setter method)
- 객체의 특징을 나타내는 인스턴스 변수 값을 외부에서 접근하는 것은 매우 위험함
- 위험성을 줄이기 위해 인스턴스 변수 값의 의미를 아는 getter(), setter() 메소드 제공하고,
이를 통하여 인스턴스 변수를 접근하도록 함
커스텀 메소드 정의
구조
[<methodModifier>] <methodDeclaration> {
<methodBody>
}
<methodDeclartion>
- <returnType> methodName (<argumentList>)
<methodBody>
- 프로그래밍 로직이나 코드가 삽입된 영역
객체 생성과 사용
What
- 클래스로부터 객체를 생성하는 것, new 예약어를 활용함
- 객체 참조변수에 배정하는 것
How
- import java.util.ArrayList;
ArrayList arrList = new ArrayList();
설명
- ArrayList 클래스 형 참조 변수 arrList를 선언
- new는 ArrayList 클래스의 생성자 ArrayList()를 호출하여 객체를 생성
- 생성된 객체를 참조 변수 arrList에 할당
- import문을 이용해서 사용하려는 클래스를 지정해야 함
- java.lang 패키지는 지정하지 않아도 컴파일러가 import를 수행함. 디폴트 패키지라고 함
생성 과정
메모리 할당
- 인스턴스 변수 크기의 기억공간을 힙에 할당
- 초기값이 지정되지 않은 경우 묵시적 초기화(기본값)
명시적인 초기화
- 초기값이 지정된 변수 초기화
- 참조 변수는 객체 생성 후 참조값을 참조 변수에 배정
생성자 코드 실행
생성 완료된 객체 참조값 반환
객체 사용
What
생성된 객체가 가지고 있는 메소드를 호출하는 것 (또는 수신 객체에 메시지를 전달하는 것)
- 메시지(Message) : 객체들 간의 주고 받는 정보를 의미함
메시지 수신 객체의 식별자와 메소드 이름, 매개변수
How
StringTokenizer strTok = new StringTokenizer(line);
ArrayList arrList = new ArrayList();
while (strTok.hasMoreTokens()) {
String str = strTok.nextToken();
arrList.add(str);
}
매개변수의 종류
형식 매개변수(formal parameter)
- 메소드를 정의할 때 사용하는 매개변수
실제 매개변수(actual parameter)
- 메소드를 호출할 때 사용하는 매개변수
매개변수 전달(parameter transmission) 방법
형식 매개변수에 실제 매개변수를 전달하는 것
형식 매개변수의 자료형과 개수는 실제 매개변수와 같아야 한다.
값을 통한 호출(call by value)
- 인자값을 복사해서 전달함
- 자바의 기본 메소드 호출 방법
주소를 통한 호출(call by reference)
- 인자값의 주소를 전달함
가변 매개변수
실제 매개변수의 개수가 상황에 따라 가변적인 경우를 형식 매개변수를 결정할 수 없는 문제를 해결하기 위한 방법
- jdk 1.5부터 지원
- 구문
<자료형>... <매개변수>
public static void main(String[] args)
자바 프로그램의 시작점
정의한 클래스로부터 생성된 객체들을 테스트하는 모듈
- args는 명령행 매개 변수를 전달 받는 형식 매개변수임
public class CommandLine {
public static void main(String[] args) {
for(int i = 0; i < agrs.length; i++)
System.out.println(“Args[” + i + “] = ” + agrs[i]);
}
}
정적 초기화문
초기화 식에 의해서 정적 변수를 초기화 할 수 없을 때 사용
생성자 보다 먼저 실행됨
구문
static {
<문장>
}
예) static int i, j;
static { j = 4; }
가비지 컬렉터
자바에서는 참조없는 객체를 자동 회수함
할당된 메모리를 회수하기 전에 그 객체의 finalize 메소드를 호출함
응용 프로그램 종료 후 호출 됨
- 강제 호출도 가능 : gc()
finalize 메소드
- Object 클래스에 정의되어 있음
protected void finalize() throws Throwable {
}
객체 지향 vs. 객체 기반
객체지향(object-oriented) 프로그래밍
- 클래스를 정의하고, 클래스로부터 프로그램을 구성하는 객체를 생성하여 프로그램에서 사용
예)
- Java, Smalltalk, C++
객체기반(object-based) 프로그래밍
- 제공되는 객체로 프로그램에서 사용
예)
- Javascript
'2-1 > JAVA 프로그래밍' 카테고리의 다른 글
JAVA 프로그래밍 7주차 정리 (0) | 2023.04.17 |
---|---|
JAVA 프로그래밍 6주차 정리 (0) | 2023.04.11 |
JAVA 프로그래밍 4주차 정리 (0) | 2023.03.28 |
JAVA 프로그래밍 3주차 정리 (0) | 2023.03.21 |
JAVA 프로그래밍 2주차 정리 (0) | 2023.03.14 |