Programming Language/JAVA

클래스와 객체

D4tai1 2018. 7. 14.

그림은 "명품 자바프로그래밍" 책을 참고하였습니다.

 

4. 클래스와 객체

1. 자바의 특징

 1) 절차 지향 프로그래밍

  ▶ 작업 순서를 표현하는 컴퓨터 명령 집합

  ▶ 함수들의 집합으로 프로그램 작성

 

 2) 객체 지향 프로그래밍

  ▶ 프로그램을 실제 세상에 가깝게 모델링

  ▶ 컴퓨터가 수행하는 작업을 객체들 간의 상호 작용으로 표현

 

 3) 캡슐화

  ▶ 메소드(함수)와 데이터를 클래스 내에 선언하고 구현

  ▶ 외부에서는 공개된 메소드의 인터페이스만 접근 가능

  ▶ 외부에서는 비공개 데이터에 직접 접근하거나 메소드의 구현 세부를 알 수 없음

  ▶ 객체 내 데이터에 대한 보안, 보호, 외부 접근 제한

 

 4) 다형성

  ▶ 동일한 이름의 기능이 서로 다르게 작동하는 현상

  ▶ 자바의 다형성 사례

   - 슈퍼 클래스의 메소드를 서브 클래스마다 다르게 구현하는 메소드 - 오버라이딩

   - 한 클래스 내에 구현된 동일한 이름이지만 다르게 작동하는 여러 메소드 - 오버로딩

 

 5) 클래스

  ▶ 클래스 외부에는 어떤 필드나 메소드도 존재불가(캡슐화의 원칙)

  ▶ 객체의 속성과 행위 선언

  ▶ 객체의 설계도 혹은 틀

  ▶ 필드, 메소드, 생성자로 구성

 

 6) 객체

  ▶ 클래스의 틀로 찍어낸 실체

  ▶ 메모리 공간을 갖는 구체적인 실체

  ▶ 클래스를 구체화한 객체를 인스턴스(instance)라고 부름

 

 7) 클래스 접근 지정자

  ▶ 다른 클래스들에서 이 클래스를 사용하거나 접근할 수 있음을 선언(생략 시 default)

 

 8) 선언

  ▶ class PersonPerson이라는 이름의 클래스 선언

 

 9) 필드(field)

  ▶ 값을 저장할 멤버 변수

 

 10) 생성자(constructor)

  ▶ 클래스의 이름과 동일한 메소드

  ▶ 클래스의 객체가 생성될 때만 호출되는 메소드

  ▶ return 값이 없을 때

  ▶ 필드를 초기화 및 꼭 필요한 작업을 위해 두는 것

 

 11) 메소드(method)

  ▶ 메소드는 함수이며 객체의 행위를 구현

  ▶ 메소드의 접근 지정자 public

   - 메소드를 다른 클래스의 메소드에서 호출할 수 있도록 공개한다는 의미

 

 12) 객체 생성 과정

  [1] 객체에 대한 레퍼런스 변수 선언

   - 레퍼런스 변수 선언했다고 객체가 생성되지 않음

   - 이것은 변수 aPersonPerson 클래스의 객체에 대한 주소, 즉 레퍼런스를 가지는 변수일 뿐이며 객체가 아님

   - 레퍼런스 변수만 생기고 NULL로 초기화

  [2] Person 객체 생성

   - Person 타입 크기의 메모리 할당

   - Person( ) 생성자 코드 실행

public static void main(String args[]) { Person p; //레퍼런스 변수 p생성 p = new Person("d4tail"); //Person 객체 생성 p.age = 30; //Person 타입 객체 p의 멤버 age에 접근 String s = p.getName(); //객체 p의 메소드 getName() 호출 }

 

 13) 객체 멤버 접근 [ ex) aPerson.age = 30; ]

  ▶ 레퍼런스 변수 뒤에 .() 연산자를 붙여서 접근

 

 14) 객체 배열 생성과정

 

15) 메소드 형식

  ▶ 자바의 모든 메소드는 반드시 클래스 안에 있어야 함(캡슐화 원칙)

 

 16) 객체 혹은 배열을 전달하는 경우 (call by reference) 

  객체나 배열의 레퍼런스만 전달

  ▶ 객체 혹은 배열이 통째로 복사되어 전달되는 것이 아님 

  ▶ 메소드의 매개 변수와 호출한 실인자가 객체나 배열을 공유하게 됨

  ▶ ex) 출력결과를 쓰시오.

 

 17) 오버라이딩 - 다형성

  ▶ 슈퍼클래스에 구현된 메소드를 서브클래스에서 동일한 이름으로 자신의 특징에 맞게 다시 구현

 

 18) 오버로딩(매개변수가 기준[개수, 타입]) - 다형성

  ▶ 한 클래스 내에서 두 개 이상의 이름이 같은 메소드 작성 ▶ 메소드 이름이 동일하여야 함

  ▶ 매개 변수의 개수가 서로 다르거나, 타입이 서로 달라야 함

  ▶ 리턴 타입은 오버로딩과 관련 없음

 

 19) this (객체 자신에 대한 레퍼런스) ?

  ▶ 현재 실행되는 메소드가 속한 객체에 대한 레퍼런스

  ▶ 컴파일러에 의해 자동 선언 : 별도로 선언할 필요 없음

 

 20) this의 필요성

  ▶ 객체의 멤버 변수와 메소드 변수의 이름이 같은 경우

  ▶ 다른 메소드 호출 시 객체 자신의 레퍼런스를 전달

  ▶ 메소드가 객체 자신의 레퍼런스를 반환할 때

 

 21) 생성자(메소드 중 클래스와 이름이 동일)의 특징

  ▶ 생성자는 new를 통해 객체를 생성할 때만 호출됨

  ▶ 생성자는 하나 이상 선언되어야 함

  ▶ 개발자가 생성자를 작성하지 않았으면 컴파일러에 의해 자동으로 기본 생성자가 선언됨

  ▶ 기본 생성자를 디폴트 생성자라고도 함

  ▶ 생성자 이름은 클래스 이름과 동일

  ▶ 생성자도 오버로딩하여 여러 개 작성 가능

  ▶ 생성자는 리턴 타입을 지정할 수 없음

   =>그러나 return문을 사용할 수는 있다.

  ▶ 생성자의 목적은 객체가 생성될 때 초기작업을 위함

    =>필드초기화, 필요한 메모리 확보, 파일열기, 네트워크 연결 

 

 22)기본 생성자(default constructor)

  ▶ 클래스에 생성자가 하나도 선언되지 않은 경우

  ▶ 컴파일러에 의해 자동으로 생성

  ▶ 매개 변수 없는 생성자

  ▶ 아무 작업 없이 단순 리턴

  ▶ Default 생성자라고도 부름

  ▶ 클래스에 생성자가 하나라도 존재하면 기본 생성자가 자동 삽입되지 않음

 ex) 기본생성자가 자동으로 생성되지 않은 경우는?

  ▶ 생성자가 하나라도 존재하는 클래스에는 기본생성자를 삽입해주지 않음

  ▶ 오류나지 않으려면 기본생성자 삽입

 

 23) this() - Static 메소드에서는 사용 불가

 ▶ 은 클래스의 다른 생성자 호출 시 사용 - 사용목적

 ▶ 생성자 내에서만 사용(다른 메소드에서 사용 불가)

 ▶ 반드시 생성자 코드의 제일 처음에 수행

 

 24) 객체치환

 ▶ 객체가 레퍼런스 됨을 의미

 ▶ 같은 곳을 가리킨다는 뜻 (A = B)

 ▶ 객체를 복사하는 것이 절 때 아님

 

 25) 객체배열

 ▶ Circle[] c = new Circle[5]; //각 방 레퍼런스 변수 

 ▶ c[i] = new Circle( ); //for문으로 반복

 ▶ c[i].name , c[i].get()

 

 26) 객체 소멸

 ▶ new에 의해 생성된 객체 메모리를 자바 가상 기계로 되돌려 주는 행위[반납]

 ▶ 소멸된 객체 공간은 가용 메모리에 포함

 ▶ 자바 응용프로그램에서 임의로 객체 소멸할 수 없음

 ▶ 객체 소멸은 자바 가상 기계의 고유한 역할

 ▶ 자바 개발자에게는 매우 다행스러운 기능

 ▶ C/C++에서는 개발자가 프로그램 내에서 삭제

 

 27) 가비지

  ▶ 가리키는 레퍼런스가 하나도 없는 객체

  ▶ 더 이상 접근하여 사용할 수 없게 되었음

 

 28) 가비지 켈렉션

  ▶ 자바 가상 기계의 가비지 컬렉터가 자동으로 가비지를 수집하여 반환

  ▶ 자바에서 가비지 자동 회수

  ▶ 가용 메모리 공간으로 확보

  ▶ 가비지 컬렉터(garbage collector)에 의해 자동 수행

 

 29)개발자에 의한 강제 가비지 컬렉션

  ▶ System 또는 Runtime 객체의 gc() 메소드 호출

  ▶ 이 코드는 자바 가상 기계에 강력한 가비지 컬렉션 요청

  ▶ 그러나 자바 가상 기계가 가비지 컬렉션 시점을 전적으로 판단

  ▶ System.gc(); // 가비지 컬렉션 작동 요청

 

 30) 접근지정자

  ▶ 디폴트(default) 멤버

  - 같은 패키지 내의 다른 클래스만 접근 가능

  ▶ public 멤버

  - 패키지에 관계 없이 모든 클래스에서 접근 가능

  ▶ private 멤버

  - 클래스 내에서만 접근 가능

  - 상속 받은 하위 클래스에서도 접근 불가

  ▶ protected 멤버

  - 같은 패키지 내의 다른 모든 클래스에서 접근 가능

  - 상속 받은 하위 클래스는 다른 패키지에 있어도 접근 가능

 

 31) non-static 멤버의 특성

  ▶ 인스턴스 멤버라고도 부름

  ▶ 공간적 - 멤버들은 객체마다 독립적으로 별도 존재

  ▶ 시간적 - 필드와 메소드는 객체 생성 후 비로소 사용 가능

  ▶ 비공유의 특성 - 멤버들은 여러 객체에 의해 공유되지 않고 배타적

 

32) static 멤버의 특성

 ▶ 클래스 멤버라고도 부름

 ▶ 공간적 특성 - 클래스 당 하나만 생성.

 ▶ 시간적 특성 - 클래스가 로딩될 때 공간 할당

  - 자바가상기계(JVM)가 시작되는 시점

 ▶ 공유의 특성 - 동일한 클래스의 모든 객체에 의해 공유

 

33) 전역 변수와 전역 함수를 만들 때 활용

 ▶ 자바의 캡슐화 원칙 지킴

 ▶ 다른 클래스에서 공유하는 전역 변수나 전역 함수도 반드시 클래스 내부에 구현해야 함

 

34) static 멤버를 가진 클래스 사례

 ▶ java.lang.Math 클래스

 ▶ JDK와 함께 배포되는 java.lang.Math 클래스

 ▶ 모든 필드와 메소드가 public static으로 선언

 ▶ 다른 모든 클래스에서 사용할 수 있음

[1] 잘못된 방법

- Math m = new Math(); // Math() 생성자는 private

- int n = m.abs(-5);

[2] 바른 사용법

- int n = Math.abs(-5);

 

 35) static 메소드의 제약 조건

 ▶ static 메소드는 오직 static 멤버만 접근 가능

 ▶ 객체가 생성되지 않은 상황에서도 static 메소드는 실행될 수 있기 때문에, non-static 메소드와 필드 사용 불가

 ▶ non-static 메소드는 static 멤버 사용 가능

 ▶ static 메소드는 this 사용불가

 ▶ static 메소드에 객체필드 및 일반메소드 사용불가

 36) final

 ▶ 상수 필드는 선언 시에 초기 값을 지정하여야 한다

 ▶ 상수 필드는 실행 중에 값을 변경할 수 없다

 ▶ final 클래스 - 더 이상 클래스 상속 불가능

 ▶ final 메소드 - 더 이상 오버라이딩 불가능

 ▶ final 필드 - 더 이상 변경 불가, 상수

class SharedClass {

public static final double PI = 3.141592653589793;

}

public class FinalFieldClass {

final int ROWS = 10; // 상수 정의, 이때 초기 값(10)을 반드시 설정

 

void f() {

int [] intArray = new int [ROWS];     // 상수 활용

ROWS = 30; /    / 컴파일 오류 발생, final 필드 값을 변경할 수 없다.

}

}

 

----------------- Static 멤버를 객체의 멤버로 접근 -------------------

 

---------------- Static 멤버를 클래스 이름으로 접근 -----------------

 

'Programming Language > JAVA' 카테고리의 다른 글

상속, 패키지, 제네릭컬렉션  (0) 2018.07.14
test  (0) 2018.07.14

댓글