언어/JAVA

[JAVA] ch04. 클래스와 객체

rngPwns 2025. 1. 6. 15:33

4.1 객체지향과 자바

  • 객체: 자신만의 고유한 특성과 행동을 가짐. 다른 객체들에게 행동을 요구하거나 정보를 주고받는 등 상호작용하며 살아감.
  • 객체지향 특성
    • 캡슐화: 외부와의 접속을 위해 몇 부분만을 공개 노출. 클래스(class)는 객체의 모양을 선언한 틀이며 클래스 모양 그대로 생성된 실체(instance)가 객체. 클래스 내에 필드(field)와 메소드(method)를 모두 구현. 캡슐화를 통해 객체 내 필드에 대한 외부로부터의 접근 제한

상속

  • 상속: 상위 개체의 속성이 하위개체에 물려져서, 하위개체가 상위개체의 속성을 모두 갖는 관계.
    • 자바의 상속: 자식클래스가 부모클래스의 속성을 물려받아 부모클래스에 기능을 확장(extends)하는 개념.
      • 부모클래스: 슈퍼클래스(super class) , 자식 클래스: 서브클래스(sub class). 
      • 슈퍼클래스에 만들어진 필드와 메소드를 물려받음 -> 코드 중복작성 방지. 

다형성

  • 같은 이름의 메소드가 클래스 혹 객체에 따라 다르게 구현되는 것.
  • 메소드 오버라이딩(overriding): 슈퍼 클래스에 구현된 메소드를 서브클래스에서 자신의 특징에 맞게 동일한 이름으로 다시 구현
  • 메소드 오버로딩(overloading): 클래스 내에서 같은 이름의 메소드를 여러 개 만듦

  • 객체지향언어의 목적:
    • 소프트웨어의 생명주기가 짦아져서 빠른 시간 내에 새로운 소프트웨어를 만들어야 하는데, 객체지향언어는 소프트웨어의 재사용을 위한 여러 기법을 내장하고 있기 때문에 이미 만든 소프트웨어를 상속받거나 재사용하기 쉬움. 부분수정 가능.
    • 실세계에서 발생하는 일 쉽게 프로그래밍 가능
  • 절차지향언어(ex. C언어) : 목적을 달성하기 위한 일의 흐름에 중점.

클래스와 객체

  • 클래스: 객체를 만들어 내기 위한 설계 혹 틀.
  • 객체: 클래스에 선언된 모양 그대로 생성된 실체 = 클래스의 인스턴스(instance)
  • 하나의 클래스에 객체들은 수없이 많이 생성 가능

4.2 자바 클래스 만들기

  • class: c언어의 구조체와 같이 개발자가 정의하는 새로운 데이터 타입. 
    • 클래스 구성요소; 멤버(필드_멤버변수 와 메소드-멤버함수 의 2가지)

  • 클래스 외부에 필드나 메소드를 결코 둘 수 x
  • 클래스 멤버는 필드와 메소드 (필드는 객체의 상태값을 저장할 멤버변수. 메소드는 실행가능한 함수-객체의 행위 구현)
  • public : 접근지정자, 멤버를 public으로 선언하면 다른 클래스에서 마음대로 호출하거나 접근할 수 있도록 공개한다는 뜻

객체 생성과 활용

  1. 객체에 대한 레퍼런스 변수 선언 ex) Circle pizza; 
  2. 객체 생성 - new 연산자를 사용하여 객체생성 ex) pizza = new Circle();

*레퍼런스 변수 선언 동시에 객체생성 -> Circle pizza = new Circle();

 

   3. 객체 멤버 접근 : . 연산자 이용 "객체레퍼런스.멤버" 

pizza.radius=10;
pizza.name="자바피자";
double area=pizza.getArea(); //꼭 함수를 실행해줘야 계산된다.

 

4.3 생성자

  • 생성자 : 객체가 생성될 때 초기화를 위해 실행되는 메소드, 객체가 생성되는 순간 자동으로 호출.
  • 자바, C++, C# 등 거의 모든 객체지향언어에 존재

생성자 작성 및 활용

  • 생성자를 클래스 내에 여러 개 작성 가능하다.(매개변수의 개수와 타입이 다르다면)
  • 생성자는 객체를 생성할 때 한 번만 호출된다.(컴파일러는 new 문장이 실행될 때 적절한 생성자가 호출되도록 컴파일한다.)
    • ex. Circle pizza = new Circle (10,"자바피자"); / Circle donut=new Circle();
  • 생성자에 리턴타입을 지정할 수 없다. (void를 리턴 타입으로 지정해서도 안됨)
  • 생성자의 목적은 객체가 생성될 때 필요한 초기작업을 위함이다.
    • 객체의 필드에 초깃값 설정, 필요한 메모리 확보, 파일 오픈, 네트워크 연결 등

기본생성자

  • 기본생성자(디폴트 생성자): 매개변수가 없고 실행코드가 없어 아무 일도 하지 않고 단순 리턴하는 생성자.
class Circle{
        public Circle() { } 
        }
  • 기본생성자가 자동으로 생성되는 경우
    • 클래스에 생성자가 하나도 선언되어 있지 않은 경우, 컴파일러는 기본 생성자를 자동으로 생성

 

 

this 레퍼런스

  • this: 객체 자신에 대한 레퍼런스, 메소드 안에서 사용.
    • 컴파일러에 의해 자동으로 관리 -> 개발자는 사용하기만 하면 된다. 
    • this는 현재 객체에 대한 레퍼런스 -> 객체가 있어야 this도 의미가 있다.

  • ob1.set(4)이 실행될 때 this는 현재 실행중인 ob1 객체에 대한 레퍼런스
  • ob2.set(5)이 실행되면 this는 ob2객체에 대한 레퍼런스
  • this와 this()는 다르다. - this는 메소드에서 사용되며 현재객체를 가리킴
  • this는 static메소드에서 사용할 수 없음.

this()로 다른 생성자 호출

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

  • this()는 생성자에서만 사용
  • this()는 반드시 같은 클래스의 다른 생성자를 호출할 때 사용
  • this()는 반드시 생성자의 첫 번째 문장으로 사용

4.4 객체 배열

  • 객체배열: 객체에 대한 레퍼런스를 원소로 갖는 배열

배열 선언 및 생성

  1. 배열에 대한 레퍼런스 선언 : 배열을 생성하는 것이 아닌 레퍼런스 변수만 선언. 
    • Circle [] c;  // Circle[5] c; 처럼 배열크기 지정하면 컴파일오류 발생
  2. 레퍼런스 배열 생성
    • c=new Circle[5]; //Circle 객체에 대한 레퍼런스 5개 생성
  3. 객체 생성
    • Circle객체를 하나씩 생성하여 배열 c[ ]의 각 레퍼런스에 대입
    • for(int i=0; i<c.length; i++) //c.length는 배열 c의 크기로서 5
    • c[i]=new Circle(i); // i번째 Circle 객체 생성
    • 이렇게 배열의 크기만큼 Circle 객체를 생성하여 레퍼런스 배열에 하나씩 대입하면 비로소 Circle 객체배열 생성.

배열의 원소 객체 접근

  • 배열 c의 i번째 객체에 접근하기 위해서는 c[i] 레퍼런스 사용.
for(int i=0; i<c.length; i++)
System.out.print((int)(c[i].getarea())+" ");

 

4.5 메소드 활용과 객체 치환

  • 자바의 메소드 : 클래스의 멤버함수, 접근지정자를 선언한다는 점 외에 C/C++함수의 작성법과 동일

  • 접근지정자: 자바에서 메소드는 반드시 접근지정자와 함께 선언
    • public(클래스 내부/외부에서 모두 호출 가능0
    • private(클래스 멤버들만 호출가능)
    • protected(동일한 패키지의 클래스들과 상속받은 서브 클래스에서 호출가능)
    • 디폴트 접근 지정: 접근 지정자 생략 - 동일한 패키지 내의 모든 클래스에서 호출가능
  • 리턴타입: 메소드가 호출자에게 리턴할 값의 타입
  • getSum() : int 타입의 sum 리턴 -> 리턴타입=int. 메소드가 아무 값도 리턴하지 않으면 void타입으로 선언

인자 전달

  • 값에 의한 호출: 자바의 메소드 호출 시 인자 전달 방식, 호출하는 실인자의 값이 복사되어 메소드의 매개변수에 전달
  • 기본타입 값 전달
    • 매개변수가 byte, char, int, double 등 기본타입으로 선언되는 경우 : 호출자(caller)가 건네는 값이 메소드의 매개변수에 전달됨
      • ex. int n=10; increase(n); //변수 n에 저장된 값 10을 increase() 메소드에 넘겨줌

 

  • increase(int m) 메소드가 실행될 때 매개변수 m이 생기고 n의 값을 전달받아 10으로 초기화. m의 값을 1 증가시키지만 변수 n의 값을 바꾸지는 못함. increase()가 끝나고 main()으로 돌아오면 지역변수 n의 값은 여전히 10으로 남아있음.

객체가 전달되는 경우

  • 메소드의 매개변수가 클래스타입인 경우, 객체가 아닌 객체 레퍼런스 값이 전달
  • increase(pizza); 호출문에 의해 increase(Circle m)가 호출되면 매개변수 m이 생기고, pizza변수에 저장된 값(레퍼런스)가 m에 복사되어 m은 pizza가 가리키는 객체를 함께 가리킨다.
  • 메소드 호출 시 객체가 전달되는 경우, 객체에 대한 레퍼런스만 전달되고 객체가 통째로 복사되지는 않는다.

 

배열이 전달되는 경우

  • 배열이 통째로 전달되는 것이 아니라 배열에 대한 레퍼런스만 전달

 

메소드 오버로딩(메소드 중복)

  • 클래스 내에 이름이 같지만 매개변수의 타입이나 개수가 다른 여러개의 메소드 작성가능(다형성의 한 종류)
    • 두 조건을 만족해야 한다.
      1. 메소드 이름 동일
      2. 메소드 매개변수의 개수나 타입이 서로 달라야 한다.
    • 메소드의 리턴 타입은 오버로딩의 성공판단과 무관. 접근지정자도 오버로딩과 관계없음.

  • 오버로딩 실패 : 자바 컴파일러에 의해 판단. 실패하면 컴파일오류 발생

리턴타입은 오버로딩 성공 여부와 관계 x . 오직 형광펜 친 매개변수부분만 신경써야 한다.

 

객체 치환 시 주의할 점

  • 객체 치환은 객체 복사가 아니다.

s=ob2; //객체 치환. s는 ob2의 객체 가리킴
ob1=ob2; //객체치환, ob1은 ob2의 객체를 가리키게 된다.

---> 원래 ob1이 가리키던 객체는 아무도 가리키지 않게 되어, 더 이상 프로그램에서 접근할 수 없는 "가비지(garbage)" 가 된다. ->자바 가상기계에 의해 자동으로 수거되어 재사용

 

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

객체의 소멸

  • 자바에서는 객체를 생성하는 new연산자는 있지만 객체를 소멸시키는 연산자는 x. 
    • 개발자가 마음대로 객체를 소멸시킬 수 x
    • 응용프로그램에서 사용하고 있지 않은 객체나 배열 메모리를 자바 가상기계가 알아서 수거해간다.

================나중에 중간고사 보고 정리 따로 하쟈~~(중간범위 x)===========================

 

4.7 접근 지정자

자바의 패키지 개념

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

접근 지정자 

  • 접근 지정자: 클래스나 멤버들을 다른 클래스에서 접근해도 되는지의 여부를 선언하는 지시어
    • private, protected, public, 접근 지정자 생략(디폴트 접근 지정)

클래스 접근 지정

  • 클래스를 작성할 때 다른 클래스가 사용해도 되는지 허용여부 지정
    • public 클래스
      • 클래스 앞에 public으로 선언.
      • 패키지에 상관없이 다른 어떤 클래스에도 사용 허용
      • ex. public class World{ }
    • 디폴트 클래스(접근 지정자 생략)
      • ex .class Local( )
      • 오직 같은 패키지 내의 클래스들에게만 사용 허용

 

멤버 접근 지정

  • 멤버에 대한 공개 범위 : private < 디폴트 < protected < public

 

4.8 static 멤버

  • 클래스의 멤버들 중 static 지시어로 선언된 멤버
class StaticSample{
int n; //non-static 필드
void g(){ }//non-static 메소드
static int m; //static 필드
static void f(){ }//static 메소드
}

 

static으로 선언된 멤버의 특성

3개의 객체 a1, a2, a3이 생성되면 non-static 멤버 n과 g()는 각 객체마다 생기고 독립적인 공간을 할당받는다.

  • static 멤버는 클래스당 하나만 생성, 동일한 클래스의 모든 객체가 공유 -> 클래스멤버라 부름
  • non-static 멤버는 각 객체마다 별도로 생기므로 인스턴스 멤버라고 부름
    • non-static 멤버는 객체가 생길 때 함께 생성되고 객체가 사라지면 함께 사라짐
    • static 멤버는 프로그램을 시작할때나 클래스 로딩 시에 생성. 객체 생성 전에도 static 멤버는 사용할 수 있으며 생성된 객체가 소멸된 후에도 여전히 살아 공간을 차지하고 있음. 프로그램 종료 시 함께 소멸.
  • static 멤버 사용
    • non-static멤버가 객체 이름으로만 활용할 수 있는 것과 달리 static멤버는 객체 이름이나 클래스 이름으로 모두 활용할 수 있음
      • StaticSample.m=3; //클래스이름으로 static필드 접근 
      • StaticSample.f(); //클래스이름으로 static메소드 호출
      • 객체를 만들고 객체의 멤버로 접근할 수도 있음

static의 활용

  • 모든 클래스에서 공유하는 전역변수나 모든 클래스에서 호출할 수 있는 전역함수를 만들 때
    • 자바에서는 C/C++와 달리 어떤 변수나 함수도 클래스 밖에 존재할 수 X. 클래스의 멤버로 존재해야 한다.
  • 공유멤버를 만들고자 할 때
    • static으로 선언된 필드나 메소드는 이 클래스의 객체들 사이에서 공유된다.

static 메소드의 제약조건

  • 객체가 생성되지 않은 상황에서도 사용가능 => 객체에 속한 인스턴스 메소드, 인스턴스 변수 사용불가. static멤버들만 사용가능. 
    • 인스턴스 메소드는 static멤버 사용가능
  • static 메소드에서는 this 사용불가
    • static 메소드는 객체 없이도 존재 -> static 메소드에서 this 사용불가.

4.9 final

==중간시험범위 아니므로 나중에 정리==