Notice
Recent Posts
Recent Comments
Link
관리 메뉴

브래의 슬기로운 코딩 생활

JAVA 프로그래밍 5주차 정리 본문

2-1/JAVA 프로그래밍

JAVA 프로그래밍 5주차 정리

김브래 2023. 4. 4. 20:28

클래스와 객체


객체(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