04. 클래스와 객체

PearLine_Zero·2023년 10월 22일

Java

목록 보기
4/7
post-thumbnail

4.1 객체 지향과 자바

✅ 세상 모든 것이 객체이다.

객체 어려운 개념이 아니다. 우리 주변에 있는 모든 것 들이 객체임.
TV, 컴퓨터 , 책 집, 의자 등등 실세계는 객체들의 집합이며, 실세계의 객체들은 자신만의 고유한 특성행동을 가진다고 함.

✅ 자바의 객체 지향 특성

클래스객체 개념을 도입하였음. 객체 지향 언어는 다음과 같은 특성을 가짐.

👉 캡슐화

  • 캡슐화는 객체를 캡슐로 싸서 그 배누를 보호가 볼 수 없게 하는 것으로 객체의 가장 본질적인 특징임.
  • 자바에서는 클래스 객체의 모양을 선언한 틀이며, 클래스 모양 그대로 생성된 실체가 객체임
  • 자바는 필드메소드를 클래느 내에 모두 구현하며 캡슐화를 통해 객체 내 필드에 대한 외부로부터 접근을 제어함.

👉 상속

  • 상속은 상위 개체의 속성이 하위 개체에 물려져서, 하위 개체가 상위 개체의 속성을 모두 가지는 관계
  • 자식 클래스가 부모 클래스를 속성을 물려받아 부모 클래스 기능을 확장(extends)하는 개념임.
  • 부모 클래스를 슈퍼 클래스 자식 클래스를 서브 클래스라고 부름.

👉 다형성

  • 다형성은 같은 이름의 메소드가 클래스 혹은 객체에 따라 다르게 구현 되는 것을 말함.
  • 슈퍼클래스에 구현된 메소드를, 서브 클래스에서 자신의 특징에 맞게 동일한 이름으로 다시 구현하는 이른바 메소드 오버라이딩(overriding)이라고 부름.
  • 다형성의 또 다른 사럐는 클래스 내에서 같은 이름을 메소드를 여러 개 만드는 메소드 오버로딩(overloading) 이 있음.

✅ 객체 지향 언어의 목적

  • 소프트웨어의 생상성 향상
  • 실세계에 대한 쉬운 모델링

✅ 절차 지향 프로그래밍과 객체 지향 프로그래밍

  • 실행하고자 하는 절차를 정하고, 이 절차대로 프로그래밍하는 방법을 절차지향 프로그래밍이라고 함.
  • 절차 지향 언어로는 실세계 문제를 프로그래밍하기에는 표현에 한계가 있어서 객체지향프로그래밍은 이러한 단점을 극복하고 실세상의 물체를 객체로 표현함.

✅ 클래스와 객체

자바를 비롯한 객체 지향 언어에서는 클래스 객체를 만들어 내기 위한 설계 혹은 틀이며, 그 내에서 선언된 모양 그대로 생성된 실체가 객체이며 이러한 연유로 객체를 클래스의 인스턴스라고 부름.

4.2 자바 클래스 만들기

public class Circle {
	int radius;
    String name;
    
    public double getArea() {
    	return 3.14*radius*radius;
    }
}

✅ 자바 클래스 구성

  • 자바에서 class 키워드로 클래스를 선언함.
  • 클래스의 구성 요소를 멤버라고 부르며, 멤버는 필드메소드의 2가지가 있음.

    👉 클래스의 구성

    클래스는 class 키워드와 클래스 이름으로 선언하고 중괄호{ } 안에 클래의 필드와 메소드 모두 작서애야 하며 클래스 외부에 필드, 메소드 결코 둘 수 없음.

    👉 클래스 멤버

    필드와 메소드로서, 필드는 객체의 상태 값을 저장할 멤버변수이며 메소드는 실행 가능한 함수이고 객체의 행위를 구현함.

    👉 접근 지정자

    public접근 지정자로 다른 클래스에서 이용이 가능하며 멤버를 public 선언시 호출 또는 접근할 수 있는 공개상태임.

✅ 객체 생성과 활용

객체에 대한 레퍼런스 변수 선언과 객체 생성의 두 가지 과정으로 구분

4.3 생성자

✅ 생성자의 개념과 목적

생성자는 객체가 생성될 때 초기화를 위해 실행되는 메소드

✅ 생성자 작성 및 활용

  • 생성자 이름은 클래스 이름과 동일해야한다.
  • 생성자를 여러 개 작성할 수 있다.
  • 생성자는 객체를 생성할 때 한 번만 호출된다.
  • 생성자에게 리턴 타입을 지정할 수 없다.
  • 생성자의 목적은 객체가 생성될 때, 필요한 초기 작업을 위함이다.

✅ 기본 생성자

기본 생성자란 매개 변수가 없고 또한 실행 코드가 없이 아무일도 하지 않고 단순 리턴하는 생성자이며 디폴트 생성자라고 부름.

👉 기본 생성자가 자동으로 생성되는 경우

  • 생성자가 없는 클래스는 있을 수 없으므로 생성자가 하나도 없는 경우 컴파일러는 기본 생성자를 자동으로 생성함.

👉기본 생성자가 자동으로 생성되지 않는 경우

  • 생성자가 하나라도 존재하면 컴파일러가 기본 생성자를 임의로 삽입해 주지 않음.

✅ this 레퍼런스

  • this객체 자신에 대한 레퍼런스로서 메소드 안에서만 사용함.
  • this는 컴파일러에 의해 자동으로 관리되므로, 개발자는 사용만 하면 됨.

✅ this()로 다른 생성자 호출

this()는 클래스 내에서 생성자가 따른 생성자호출할 때 사용하는 자바 코드임.

4.4 객체 배열

✅ 객체배열

객체배열은 객체에 대한 레퍼런스 원소로 갖는 배열임.

✅ 배열 선언 및 생성

객체 배열을 만들기 위해서는 다음의 3단계가 필요함.

  • 배열에 대한 레퍼런스
  • 레퍼런스 배열 생성
  • 객체 생성

4.5 메소드 활용과 객체 치환

메소드를 여러 개 선언하는 메소드 오버로딩에 대해 설명함.

public int getSum(int i , int j) {
	int sum;
   sum = i + j;
   return sum;
}

✅ 메소드 형식

접근 지정을 선언한다는 점에서 C/C+함수의 작성법괴 같음.

👉 접근 지정자

  • 자바에서는 메소드는 반드시 접근 지정자와 함께 선언되어야함.
  • public , private, protected,가 있으며 접근 지정자가 생략된 디폴트 접근 지정의 경우 동일한 패키지 내의 모든 클래스 호출이 가능함.

👉 리턴 타입

  • 리턴 타입은 메소드가 호출자에게 리턴할 값을 말함.
  • 메소드가 아무 값도 없는 리턴하지 않는다면 void타입으로 선언함.

✅ 인자 전달

자바의 메소드 호출 시 인자 전달 방식은 값에 의한 호출을 말함.

👉 기본 타입의 값이 전달 되는 경우

  • 매개변수가 기본타입(byte, int, char, double)으로 선언되는 경우, 호출자가 건네는 값이 메소드의 매개 변수에 복사되어 전달함.

👉 객체가 전달되는 경우

  • 메소드가 매개변수가 클래스 타입인 경우, 객체가 아니라 객체의 레퍼런수 값이 전달됨.

👉 배열이 전달되는 경우

  • 객체가 전달되는 경우와 동일하게, 배열이 통째로 전달되는 것이 아니라 배열에 대한 레퍼런스만 전달됨.

✅ 메소드 오버로딩

자바에서는 클래스 내에 이름이 같지만 매개 변수의 타입이나 개수가 서로 다른 여러개의 메소드를 작성할 수 있음. 이것을 메소드 오버로딩이라고 함. 혹은 메소드 중복이라고 부름.
오버로딩이 성립되려면 2가지 조건을 만족해야함
(1) 메소드 이름이 동일하여야 한다.
(2) 메소드 매개 변수의 개수나 타입이 서로 달라야 한다.

👉 오버로딩 성공

  • 매개 변수의 타입과 개수가 서로 달라 오버로딩이 성공함.

    👉 오버로딩 실패

  • 성공 여부는 자바 컴파일러에 의해 판단되며 실패하면 컴파일 오류가 생김.

✅ 객체 치환 시 주의할 점

객체의 치환은 객체를 복사하는 것아 아니라는 점을 주의해야 함!

4.6 객체의 소멸과 가비지 컬렉션

✅ 객체의 소멸

객체를 소멸 시키는 연산자는 없다 그러므로 개발자가 마음대로 객체를 소멸이 불가능함.

✅ 가비지

  • 할당받은 객체나 배열 메모리 중에서 더 이상 사용하지 않게 된 메모리를 가비지라고 부름.
  • 자바 플랫폼은 참조하는 레퍼런스가 하나도 없는 객체나 배열을 가비지로 판단함 이유는 프로그램에서 더 이상 접근할 수 없게 되었기 때문임.

✅ 가비지 컬렉션

  • 가비지가 많아지면 응용프로그램에서 할당해줄 수 있는 가용 메모리의 양이 줄어듬.
  • 가바지가 점점 늘어나면 가용 메모리가 0이 되면, 자바 응용프로그램은 더 이상 실행이 불가함.
  • 가용 메모리 공간이 일정 크기 이하로 줄어들면, 자바 가상 기계는 자동으로 가비지를 회수하여 가용 메모리 공간을 늘림 이것을 가비지 컬렉션이라고 함.
  • 가비지 컬렉션은 자바 가상 기계 내에 준비된 가비지 컬렉션 스레드에 의해 처리됨.
  • 실시간 처리 목적에는 부적합 것으로 알려짐.

✅ 가비지 컬렉션 강제 수행

system 또는 Runtime 객체의 gc() 메소드를 호출하여, 자바 플랫폼에 가비지 컬렉션을 요청가능함.
System.gc(); // 가비지 컬렉션 작동 요청

4.7 접근 지정자

✅ 자바의 패키지 개념

  • 자바에서는 상호 관련 있는 클래스 파일들을 패키지에 저장하여 관리함.
  • 패키지는 디렉터리 혹은 폴더 개념임.

✅ 접근 지정자

대부분 객체 지향 언어에는 접근 지정자를 두고 있음.

  • private, protected, public, 접근 지정자 생략(디폴트 접근 지정)

✅ 클래스 접근 지정

👉 public 클래스

  • 패키지 상관 없이 다른 어떤 클래스에게도 사용이 허용된다는 점.

👉 디폴트 클래스(접근 지정자 생략)

  • 접근 지정자 없이 클래스를 선언한 경우 디폴트 접근 지정으로 선언 되었다고 함.
  • 디폴트로 선언된 클래스는 오직 같은 패키지 내에 있는 클래스들만 사용이 허용됨.

✅ 멤버 접근 지정

4가지가 있으며 private < 디폴트 < protected < public 순으로 넓어짐.

👉 public 멤버

  • 패키지를 막론하고 모든 클래스들이 접근이 가능

👉 private 멤버

  • 접근 지정자를 비공개 한다는 의로 클래스 내의 멤버들에게만 접근이 허용됨.

👉 protected 멤버

  • 보호된 공개를 의미함 두 가지 클래스 내에서만 공개함.
    (1) 같은 패키지 내의 모든 클래스 접근이 가능
    (2) 다른 패키지에 있더라도 자식 클래스 인 경우 접근이 허용함 protected는 상속과 관련이 있기 때문임.

👉 디폴트 멤버

  • 접근 지정자가 생략된 멤버를 경우를 말하며 동일한 패키지 내에 있는 클래스들만 자유롭게 접근이 가능함.

4.8 static 멤머

✅ static 멤버 선언

클래스의 멤버들 중 static 지시어로 선언된 멤버를 static멤버라고 함.

✅ static 멤버의 특성

  • static멤버는 클래스당 하나만 생성 되는 멤버로서, 동일한 클래스의 모든 객체들이 공유하므로 클래스 멤버라고 부름.
  • non-static 멤버는 각 객체마다 별도로 생기므로 인스턴스 멤버라고 부름.

✅ static 멤버 사용

static 멤버는 객체의 이름이나 클래스 이름으로 모두 활용이 가능함.
staticSample.m = 3; // 클래스 이름으로 static 필드 접근
staticSqmple.f(); // 클래스 이름으로 static 메소드 호출

  • 객체를 만들고 싶으면 객체로 멤버 접근이 가능함.
  • non-static 멤버는 클래스 일므으로 접근 할 수 없음.

✅ static 활용

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

  • 모든 클래스에서 공유하는 전역 변수나 모든 클래스에서 호출할 수 있는 전역 함수를 만들고자 할 때 static을 선언하면 됨.

👉 공유 멤버를 만들고자 할 때 활용

  • static으로 선언된 필드나 메소드는 클래스 객체들 사이에서 공유됨.

✅ static 메소드의 제약 조건

두가지 제약 사항을 가짐

  • static 메소드는 오로지 static 멤버만 접근할 수 있다.
  • static 메소드에서는 this를 사용할 수 없다.

4.9 final

✅ final 클래스

  • final 클래스 이름 앞에 사용되면 클래스를 상속 받을 수 없음을 지정함.

✅ final 메소드

  • final 메소드 앞에 부으면 이 메소드는 더 이상 오버라이딩 할 수 없음을 지정함.

✅ final 필드

  • 자바에서는 final 필드를 선언하면 상수가 됨.
profile
https://baesaa0304.tistory.com 블로그 이사합니다~

0개의 댓글