메소드의 중복(Method Overloading)
- 동일한 메소드 명이라도 자료형이나 매개변수의 개수가 다를 경우 다른 메소드로 취급
배열 매개변수로 넘기기
- arr배열을 그대로 매개변수로 넘김
int []arr = {6,2,3,9,7};
System.out.println(util.getMax(arr));
class 변수, class 메소드
- static 변수, static 메소드 = 정적변수, 정적 메소드라고도 부름
class 변수
- 멤버변수 앞에 static 키워드가 붙어있는 변수를 말하며 객체 생성을 하지 않고 사용할 수 있음.
class 메소드
- 메소드명 앞에 static 키워드가 붙어있는 메소드를 말하며 객체 생성을 하지 않고 사용할 수 있음
모두 클래스 이름으로 접근 가능하다.
클래스명.속성
class Person{
static String addr; //
}
public class PersonTest {
public static void main(String[] args) {
Person.addr="dd";
}
}
- static 메소드 안에서 다른 변수나 메소드를 호출 할때 static이 붙어있지 않는 변수나 메소드는 호출 불가능
- 왜냐하면, static은 컴파일 시점에 정의가 되는건데 당연히 일반 변수/메소드는 정의가 나중에 되기 때문임
- 쉽게 설명하자면, static 메소드 안에서는 static만 호출 가능하다 라고 이해할 것
메모리 할당 영역 설명
* Method 영역 = Code 영역 (static) / Stack 영역 = 객체가 갖는 변수들의 주소 / Heap 영역 = 객체의 변수
* 스택의 객체명은 힙의 객체의 변수들의 주소를 갖음. (만일 해당 객체의 변수가 3개면 3개가 세트로 한 주소에 할당되어 짐)
Call By Value (값에 의한 호출)
- 메소드 호출 시에 기본 자료형이 전달되는 것을 말하며, 메소드 안에서 전달된 값이 변경되더라도 호출하는 쪽에서는 변경된 내용이 적용되지 않음
class Exam01{
//정수형 변수 하나를 매개변수로 전달받아 1 증가 시키는 메소드
public static void plusOne(int n) {
n=n+1;
System.out.println(n);
System.out.println("메소드 안에서 값을 변경하였습니다.");
}
}
public class CallByValueTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
int age;
age=28;
Exam01.plusOne(age);
System.out.println(age);
}
}
age 값에 + 1을 했음에도 불구하고 실제 age는 변화 없이 28 그대로임
Call By Reference (참조에 의한 호출)
- 메소드 호출 시에 참조 자료형(객체, 배열)이 전달되는 것을 말하며 메소드 안에서 전달된 값이 변경될 때에 호출하는 쪽에서 변경된 내용이 적용된다
- 매개 변수로 객체나 배열을 받게 되면 해당 매개변수는 원본의 주소 값을 가리킨다. 그래서 객체나 배열을 받은 후 값을 변경하면 원본의 값도 같이 바뀐다.
- 참조변수 : 메모리가 있는 영역을 가리키는 변수
배열을 참조 변조로 사용
결과 값을 보면 'plusOne' 함수 밖으로 나와서도 data[i]++가 적용 된 것을 확인 가능
class Exam02{
// 정수형 배열을 매개변수로 전달받아 모든 요소를 출력하는 메소드를 정의
public static void printArray(int []data) {
for(int i=0; i<data.length; i++) {
System.out.println(data[i] + "\t");
}
}
// 정수형 배열을 매개변수로 전달받아 모든 요소를 1씩 증가시키는 메소드
public static void plusOne(int []data) {
for(int i=0; i<data.length; i++) {
data[i]++;
}
System.out.println("메소드 안에서 배열의 요소 출력");
printArray(data);
}
}
public class CallByReferenceTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
int []arr = {10,20,30,40,50};
System.out.println(" 메소드하기 전의 배열" );
Exam02.printArray(arr);
Exam02.plusOne(arr);
System.out.println(" 메소드 호출한 후 배열 " );
Exam02.printArray(arr);
}
}
객체를 참조 변수로 사용
결과 값을 보면 'plusOne' 함수 밖으로 나와서도 age++가 적용 된 것을 확인 가능
class Person{
String name;
int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
}
class Exam03{
// person 객체를 매개변수로 전달받아 나이를 1증가 시키는 메소드를 정의
public static void plusOne(Person p) {
p.age++;
System.out.println("메소드 안에서 출력");
System.out.println(p.name + ", " + p.age);
System.out.println();
}
}
public class CallByReferenceTest02 {
public static void main(String[] args) {
Person kim = new Person("김민혁", 28);
System.out.println("메소드 호출한 후 ");
System.out.println(kim.name+","+kim.age);
System.out.println();
Exam03.plusOne(kim);
}
}
자바 상속
public class 클래스명 extends 상속클래스명 {
}
- A 클래스의 내용을 B클래스에서 그대로 상속받아 사용할 수 있음.
- 상속 관계에 있을 경우 자식의 객체 생성하면 부모의 생성자가 먼저 동작하고 자식의 생성자가 후에 동작한다.
- 한마디로 상속 관계에 있을 때에는 자식 클래스는 부모클래스의 생성자 형식을 그대로 따온 생성자를 만들어야 한다. (당연한 말이지만 헷갈릴 수 있으니 주의)
- 재사용성, 유지보수의 편의성, 가독성을 높임, 코드의 양을 줄임
super( )
- 부모의 생성자를 요구하는 메소드, 반드시 첫번째 줄에 와야함.
- super는 부모의 생성자를 요구하는 것이니까 부모의 생성자도 실행됌
- 언제 사용하냐면, 부모클래스와 자식클래스에 '같은 이름 / 같은 인자 값'을 같는 메소드가 존재할 경우에 부모 클래스의 메소드를 사용하고 싶을 경우에 'super.메소드' 를 사용
Protected
- 상속관계에 있을 때에 아무리 자식클래스라 할지라도 부모클래스의 private 영역에는 접근할 수 없음.
- 그래서 외부의 다른 클래스로부터는 보호하되, 상속한 자식 클래스들에게는 접근을 허용하기 위한 protected를 사용
name만 protected로 설정 했을 경우
private으로 된 속성은 참조 못해서 에러 발생
상속 관계에 있을 경우 부모 생성자가 먼저 동작
Customer의 기본 생성자는 기본적으로 Person의 기본 생성자를 실행시킴
class Person{
public Person() {
System.out.println("Person의 생성자가 먼저 동작함");
}
}
class Customer extends Person{
public Customer() {
//super(); // super()가 기본적으로 생략되어 있음
System.out.println("Customer의 생성자는 나중에 동작함");
}
}
public class PersonTest {
public static void main(String[] args) {
Customer c = new Customer();
}
}
메소드 오버라이딩(Overriding)
- 상속 관계에 있을 때에 부모 클래스의 메소드가 자식 클래스에는 맞지 않아 재정의 하는 것을 말합니다.
- 재정의 시 메소드 이름, 매개변수의 개수, 자료형이 일치되게 재정의 해야합니다.
부모클래스 fly( )
public void fly() {
if(wings==true) {
System.out.println(color+"색 "+name+"이(가) 펄럭펄럭 ~");
}
else
{
System.out.println(color +"색 "+name+"이(가) 날수 없어요");
}
}
자식클래스 fly( ) 재정의
public void fly() {
System.out.println(color+"색 "+name+"이(가) 슝~");
}
자바에서 모든 클래스의 조상 클래스는 Object 클래스이다.
- 배열과 객체는 기본적으로 주소값을 가리키는 참조변수 이기때문에 == 비교 연산자 사용 불가능
- 부모 Object 클래스의 equals 를 재정의하여 비교해보자.
* 중요
Object p 매개변수를 (Box) 클래스로 타입캐스팅 하여 b 로 저장하는 것이 중요함.
Box 클래스에서 Object 클래스의 equals 함수 재정의
class Box{
double width;
double length;
double height;
public Box(double width, double length, double height) {
this.width = width;
this.length = length;
this.height = height;
}
public boolean equals(Object p) { //equals 함수를 재정의
boolean flag = false;
Box b = (Box)p; //매개 변수로 입력 받은 p를 비교할 Box으로 타입캐스팅 후 b로 저장
if(b.width==width && b.length==length && b.height == height) {
flag = true;
}
return flag;
}
}
Main 함수
public static void main(String[] args) {
Box b1 = new Box(10, 20, 30);
Box b2 = new Box(10, 20, 30);
if (b1.equals(b2)) {
System.out.println("같아요");
}
else {
System.out.println("달라요");
}
}
만일 객체를 바로 출력하면 주소 값이 바로 출력되는데 이때 사용되는 함수는 toString() 함수로 기본적으로 생략되어져 있음
toString, equals
- 자바의 제일 조상인 Object의 메소드이며 필요하다면 자신의 클래스에 맞도록 재정의하여 사용할 것
toString() 오버라이딩 하는 경우
- 출력문에 객체를 표현하고자 할 때 사용
- toString 은 object의 주소를 그대로 출력
equals() 오버라이딩 하는 경우
- 서로의 동일한 속성값을 갖고있는지 판별하려면equals 메소드를 재정의하여 사용
- equals는 주소 값에 저장된 값이 같은지 비교
반응형
'개발 > 교육' 카테고리의 다른 글
(Java)10일차 (0) | 2022.04.08 |
---|---|
(Java) 9일차 (0) | 2022.04.07 |
(Java) 6일차 (0) | 2022.04.04 |
(Java) 5일차 (0) | 2022.04.01 |
22033) 숙제 4번, 4지 선다형 (0) | 2022.03.31 |
댓글