언어/JAVA
[JAVA] ch04. 클래스와 객체
rngPwns
2025. 1. 6. 15:33
4.1 객체지향과 자바
- 객체: 자신만의 고유한 특성과 행동을 가짐. 다른 객체들에게 행동을 요구하거나 정보를 주고받는 등 상호작용하며 살아감.
- 객체지향 특성
- 캡슐화: 외부와의 접속을 위해 몇 부분만을 공개 노출. 클래스(class)는 객체의 모양을 선언한 틀이며 클래스 모양 그대로 생성된 실체(instance)가 객체. 클래스 내에 필드(field)와 메소드(method)를 모두 구현. 캡슐화를 통해 객체 내 필드에 대한 외부로부터의 접근 제한
상속
- 상속: 상위 개체의 속성이 하위개체에 물려져서, 하위개체가 상위개체의 속성을 모두 갖는 관계.
- 자바의 상속: 자식클래스가 부모클래스의 속성을 물려받아 부모클래스에 기능을 확장(extends)하는 개념.
- 부모클래스: 슈퍼클래스(super class) , 자식 클래스: 서브클래스(sub class).
- 슈퍼클래스에 만들어진 필드와 메소드를 물려받음 -> 코드 중복작성 방지.
- 자바의 상속: 자식클래스가 부모클래스의 속성을 물려받아 부모클래스에 기능을 확장(extends)하는 개념.
다형성
- 같은 이름의 메소드가 클래스 혹 객체에 따라 다르게 구현되는 것.
- 메소드 오버라이딩(overriding): 슈퍼 클래스에 구현된 메소드를 서브클래스에서 자신의 특징에 맞게 동일한 이름으로 다시 구현
- 메소드 오버로딩(overloading): 클래스 내에서 같은 이름의 메소드를 여러 개 만듦
- 객체지향언어의 목적:
- 소프트웨어의 생명주기가 짦아져서 빠른 시간 내에 새로운 소프트웨어를 만들어야 하는데, 객체지향언어는 소프트웨어의 재사용을 위한 여러 기법을 내장하고 있기 때문에 이미 만든 소프트웨어를 상속받거나 재사용하기 쉬움. 부분수정 가능.
- 실세계에서 발생하는 일 쉽게 프로그래밍 가능
- 절차지향언어(ex. C언어) : 목적을 달성하기 위한 일의 흐름에 중점.
클래스와 객체
- 클래스: 객체를 만들어 내기 위한 설계 혹 틀.
- 객체: 클래스에 선언된 모양 그대로 생성된 실체 = 클래스의 인스턴스(instance)
- 하나의 클래스에 객체들은 수없이 많이 생성 가능
4.2 자바 클래스 만들기
- class: c언어의 구조체와 같이 개발자가 정의하는 새로운 데이터 타입.
- 클래스 구성요소; 멤버(필드_멤버변수 와 메소드-멤버함수 의 2가지)
- 클래스 외부에 필드나 메소드를 결코 둘 수 x
- 클래스 멤버는 필드와 메소드 (필드는 객체의 상태값을 저장할 멤버변수. 메소드는 실행가능한 함수-객체의 행위 구현)
- public : 접근지정자, 멤버를 public으로 선언하면 다른 클래스에서 마음대로 호출하거나 접근할 수 있도록 공개한다는 뜻
객체 생성과 활용
- 객체에 대한 레퍼런스 변수 선언 ex) Circle pizza;
- 객체 생성 - 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 객체 배열
- 객체배열: 객체에 대한 레퍼런스를 원소로 갖는 배열
배열 선언 및 생성
- 배열에 대한 레퍼런스 선언 : 배열을 생성하는 것이 아닌 레퍼런스 변수만 선언.
- Circle [] c; // Circle[5] c; 처럼 배열크기 지정하면 컴파일오류 발생
- 레퍼런스 배열 생성
- c=new Circle[5]; //Circle 객체에 대한 레퍼런스 5개 생성
- 객체 생성
- 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() 메소드에 넘겨줌
- 매개변수가 byte, char, int, double 등 기본타입으로 선언되는 경우 : 호출자(caller)가 건네는 값이 메소드의 매개변수에 전달됨
- increase(int m) 메소드가 실행될 때 매개변수 m이 생기고 n의 값을 전달받아 10으로 초기화. m의 값을 1 증가시키지만 변수 n의 값을 바꾸지는 못함. increase()가 끝나고 main()으로 돌아오면 지역변수 n의 값은 여전히 10으로 남아있음.
객체가 전달되는 경우
- 메소드의 매개변수가 클래스타입인 경우, 객체가 아닌 객체 레퍼런스 값이 전달
- increase(pizza); 호출문에 의해 increase(Circle m)가 호출되면 매개변수 m이 생기고, pizza변수에 저장된 값(레퍼런스)가 m에 복사되어 m은 pizza가 가리키는 객체를 함께 가리킨다.
- 메소드 호출 시 객체가 전달되는 경우, 객체에 대한 레퍼런스만 전달되고 객체가 통째로 복사되지는 않는다.
배열이 전달되는 경우
- 배열이 통째로 전달되는 것이 아니라 배열에 대한 레퍼런스만 전달
메소드 오버로딩(메소드 중복)
- 클래스 내에 이름이 같지만 매개변수의 타입이나 개수가 다른 여러개의 메소드 작성가능(다형성의 한 종류)
- 두 조건을 만족해야 한다.
- 메소드 이름 동일
- 메소드 매개변수의 개수나 타입이 서로 달라야 한다.
- 메소드의 리턴 타입은 오버로딩의 성공판단과 무관. 접근지정자도 오버로딩과 관계없음.
- 두 조건을 만족해야 한다.
- 오버로딩 실패 : 자바 컴파일러에 의해 판단. 실패하면 컴파일오류 발생
객체 치환 시 주의할 점
- 객체 치환은 객체 복사가 아니다.
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( )
- 오직 같은 패키지 내의 클래스들에게만 사용 허용
- public 클래스
멤버 접근 지정
- 멤버에 대한 공개 범위 : 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으로 선언된 멤버의 특성
- static 멤버는 클래스당 하나만 생성, 동일한 클래스의 모든 객체가 공유 -> 클래스멤버라 부름
- non-static 멤버는 각 객체마다 별도로 생기므로 인스턴스 멤버라고 부름
- non-static 멤버는 객체가 생길 때 함께 생성되고 객체가 사라지면 함께 사라짐
- static 멤버는 프로그램을 시작할때나 클래스 로딩 시에 생성. 객체 생성 전에도 static 멤버는 사용할 수 있으며 생성된 객체가 소멸된 후에도 여전히 살아 공간을 차지하고 있음. 프로그램 종료 시 함께 소멸.
- static 멤버 사용
- non-static멤버가 객체 이름으로만 활용할 수 있는 것과 달리 static멤버는 객체 이름이나 클래스 이름으로 모두 활용할 수 있음
- StaticSample.m=3; //클래스이름으로 static필드 접근
- StaticSample.f(); //클래스이름으로 static메소드 호출
- 객체를 만들고 객체의 멤버로 접근할 수도 있음
- non-static멤버가 객체 이름으로만 활용할 수 있는 것과 달리 static멤버는 객체 이름이나 클래스 이름으로 모두 활용할 수 있음
static의 활용
- 모든 클래스에서 공유하는 전역변수나 모든 클래스에서 호출할 수 있는 전역함수를 만들 때
- 자바에서는 C/C++와 달리 어떤 변수나 함수도 클래스 밖에 존재할 수 X. 클래스의 멤버로 존재해야 한다.
- 공유멤버를 만들고자 할 때
- static으로 선언된 필드나 메소드는 이 클래스의 객체들 사이에서 공유된다.
static 메소드의 제약조건
- 객체가 생성되지 않은 상황에서도 사용가능 => 객체에 속한 인스턴스 메소드, 인스턴스 변수 사용불가. static멤버들만 사용가능.
- 인스턴스 메소드는 static멤버 사용가능
- static 메소드에서는 this 사용불가
- static 메소드는 객체 없이도 존재 -> static 메소드에서 this 사용불가.
4.9 final
==중간시험범위 아니므로 나중에 정리==