qordpsem 2024. 5. 20. 09:16

#클래스 변수

- 일반적으로 클래스의 멤버 변수들은 객체를 생성해야지만 메모리가 확보되고 반드시 객체를 통해서 사용할 수 있음

 

만약 객체와 무관하게 사용할 메모리 공간이 필요하거나, 모든 객체가 공동으로 사용할 메모리 공간이 필요하다면 -> 멤버변수명 앞에 static 키워드를 붙여서 클래스 변수로 만들어서 사용

 

객체없이 접근해야 하기 때문에 클래스 이름으로 접근!

 

 

#클래스 메소드

- 일반적으로 멤버 메소드들은 반드시 객체를 생성하고 그 객체를 통해서 사용할 수 있음

만약 객체와 무관하게 동작시키고자 하는 기능이 있다면 메소드 이름 앞에 static 키워드를 붙여서 클래스 메소드로 만들어서 사용

객체 없이도 접근해야 하기 때문에 클래스 이름으로 접근!

 

 

#클래스 메소드에서는 반드시 클래스 멤버에만 접근할 수 있다!

객체를 생성해야만 사용할 수 있는 일반 멤버에는 접근할 수 없음!!

 

 

 

#생성자 중복

- 생성자는 클래스 이름과 같은 이름의 특수한 메소드를 말함

객체 생성 시 자동 수행되어 멤버 변수들을 초기화 할 목적으로 사용됨

생성자는 여러개 중복해서 만들 수 있다!

중복하기 위해서는 매개변수의 개수가 다르거나 / 자료형이 달라야 함

 

 

#메소드 중복(Method Overloading)

- 같은 이름의 메소드를 중복하여 정의하는 것 말함

매개변수의 개수가 다르거나 / 자료형이 달라야 함

 

 


 

#큰 수 반환 메소드 작성

public class MyUtil {
	//두 개의 정수를 매개변수로 전달받아 그 중 큰 수를 찾아서 반환하는 메소드 정의
	public int getMax(int a, int b){
		if (b>a){
			a=b;}
		return a;
	}
	//두 개의 실수를 매개변수로 전달받아 그 중 큰 수를 찾아서 반환하는 메소드 정의
	public double getMax(double a, double b) {
		if (b>a) {
			a=b;
		}
		return a;
	}
	//실수형 배열을 매개변수로 전달받아 그 중 큰 수를 찾아서 반환하는 메소드 정의
	public double getMax(double[] arr) {
		double max = arr[0]; //배열의 첫번째 수를 가장 크다고 보고 시작, 그뒤로 비교
		for(int i = 1; i<arr.length; i++) {
			if (arr[i]> max){
				max = arr[i];
			}
		}
		return max;
	}
}

 

#각 메소드 호출

public class D01MethodOverloadingTest {
	//getMax 각각 호출하기
	public static void main(String[] args) {
		MyUtil util = new MyUtil(); //MyUtil에 있는 메소드 사용하기위해 필요
		System.out.println(util.getMax(3,4));
		System.out.println(util.getMax(30.2,40.8));
		double[] data = {2.2, 3.8, 50.2, 31};
		System.out.println(util.getMax(data));
	}
}

 

 

#결과

 


 

 

#MyUtil 클래스에서 정수 반환 메소드 주석처리

 

여기를 주석처리해도

int 는 double 에 포함되기 때문에 double을 매개변수로 갖는 메소드가 동작함

 

 

#결과

 


 

 

# int형의 배열을 getMax에게 전달하면 어떻게 될까??

 

- > 오류발생

 

기본자료형 변수는 int를 double이 포함하지만, 배열은 오류 발생함!!

 

 

 

 

 


 

 

 

 

##객체지향 프로그래밍 특징

1. 은닉성

외부로부터 데이터(멤버변수)를 보호하는것

접근명시자 : private, public

 

2. 상속성

이미 정의되어있는 클래스를 확장하여(상속하여) 새로운 클래스를 만들 수 있음

코드의 재사용성을 높일 수 있음

- 상속을 해 준 클래스 "부모 클래스" ("상위 클래스")

- 상속을 받은 클래스 "자식 클래스" ("하위 클래스")

 

class 부모클래스 {

}

class 자식클래스 extends 부모클래스 {

}

 

이렇게 함으로써 자식클래스는 부모클래스의 모든 속성과 동작을 물려받음

부모 클래스의 코드 양이 몇 백줄 된다고 할때, extends 부모클래스 하면 자식클래스에서 그 코드를 모두 작성한게 됨

상속을 통해 코드의 재사용성 높일 수 있음

 

 

<동물> 이라는 단어보다 <강아지, 토끼, 악어> 라는 단어를 먼저 사용했을 것

단어들의 공통 속성과 동작을 고려하여 후에 <동물> 이라는 말을 사용했을 것

 

공통적인 속성과 동작을 뽑아서 일반화(부모클래스)하는 것도 상속이라고 할 수 있음

 

악어는 동물이다 라고 표현하듯

상속 관계도 is a 관계!

 

자식클래스의 자료형은 부모클래스의 자료형에 포함될 수 있고!

부모클래스의 자료형은 자식클래스의 자료형에 포함될 수 없음!

 


 

 

*자식 클래스에서도 부모의 private 영역에는 접근 불가능

- 아무리 상속받은 자식클래스라 할지라도 부모클래스의 private 영역에는 접근할 수 없다

- 외부의 다른 클래스로부터는 보호하고 (은닉성) / 자식클래스에게는 접근을 허용하려면 (상속성)

protected에 두면 된다

 

 

 

#default 접근 명시자

접근명시자를 생략하면 default 접근명시자로써 동일한 패키지에 있는 클래스들에게만 접근을 허용

아무리 상속받은 자식이라 하더라도 동일한 패키지에 있지 않으면 접근할 수 없음

 

상속받은 자식클래스에게 접근을 허용하려면 protected에 두어야 함

 

 

 

#접근명시자

private            :      클래스 자신만 접근할 수 있고 외부의 모든 클래스로부터 접근을 허용하지 않음

public             :      외부의 어떤 클래스라도 접근할 수 있음

protected       :      외부의 다른 클래스로부터는 보호하되, 상속된 자식클래스들에게는 접근 허용

default            :      외부의 다른 클래스로부터는 보호하되, 동일한 패키지에 있는 클래스들에게는 접근 허용

 

 

 

#super