24.05.20
#클래스 변수
- 일반적으로 클래스의 멤버 변수들은 객체를 생성해야지만 메모리가 확보되고 반드시 객체를 통해서 사용할 수 있음
만약 객체와 무관하게 사용할 메모리 공간이 필요하거나, 모든 객체가 공동으로 사용할 메모리 공간이 필요하다면 -> 멤버변수명 앞에 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