study/Java

[sist] 2024.01.10_Java : polymorphism(다형성), constructor(생성자), JVM의 memory, call by value

듀2 2024. 2. 3. 16:16

1. 대상 선정: 손오공, 크리링, 천진반

 

2. 객체 모델링:

 * 사람

 - 명사적: 눈, 코, 입, 귀, 눈썹, 목, 얼굴, 머리카락, 몸체, 팔, ...

 - 동사적: 먹는 일, 자는 일, 공부하는 일, 걷는 일, 노는 일, ...

 

3. 클래스 작성

 - Class diagram을 통해 클래스를 작성하고, 클래스 간의 관계를 설정

public class Person{
.
.
}

public class UsePerson{
.	// 객체 생성
.
}

 

4. 객체 생성

Person p = new Person();

 

5. 객체 사용

p.eat();

 


* polymorphism (다형성)

- 객체 다형성, method 다형성(Overload/Overloading, Override/Overriding) 두 가지를 제공.

 

* method overload (method overloading)

- 하나의 클래스 안에서 같은 이름의 method를 여러 개 정의해야 할 때 사용.

- java는 클래스 안에서 같은 이름의 method를 하나만 정의할 수 있다.

- 장점) 편의성

- 규칙) 어떤 method를 호출하는가? 를 알 수 있도록 만들면 된다. => parameter 관련

 

접근지정자는 달라도 되고, 반환형 달라도 되고, method명은 같아야 한다.

매개변수는 반드시 달라야 한다.

 

public void test(){ }
public void test(int i){ }
public void test(long l){ }
public void test(int i, int j){ }
public void test(int paramA, int paramB){ } // error

test(2024, 1); // 어떤 method를 호출해야할지 모르기 때문에 error가 발생한다.

 


* constructor (생성자)

- 객체가 생성될 때 기본적으로 가지고 있어야 할 값이나, 실행되어야 할 코드를 정의하는 method의 일종.

- 직접 호출되지 않는다. (new에 의해서만 호출)
- 상속되지 않는다.

- 클래스의 이름과 동일하게 만들어지고(대문자로 시작한다.), 반환형이 없다.

- this나 super를 사용하여 클래스 내의 다른 생성자를 호출할 수 있다.

- 생성자는 Overload가 된다. (객체 생성을 다양하게 할 수 있다.)

- 개발자가 생성자를 하나도 정의하지 않으면 compiler가 매개변수 없는 기본 생성자(default constructor)를 생성해준다. 개발자가 생성자를 하나라도 정의하면 compiler는 기본 생성자를 생성하지 않는다.

 

문법)

접근지정자 클래스명(매개변수 ,,,, ){
	// 객체가 생성될 때 가지고 있어야 할 기본 값 설정
   	// 객체가 생성될 때 실행되어야 할 코드 정의
}

 

- 개발자가 생성자를 하나도 정의하지 않으면 클래스의 접근지정자와 동일한 접근지정자가 붙어있는 생성자가 생성된다. (default constructor)


* JVM의 memory

class Test{
	static int i;
	int j;
   	
    public static void main(String[] args){
    	int k = 0;
        Test t = new Test();
        Test t2 = new Test();
    }
}

 

실행)

java Test

* method 영역: 실행되는 코드 적재, static 변수가 저장, 가장 먼저 실행

* stack 영역: 지역변수 저장

* instance 영역: instance 변수가 저장, new로만 사용 가능. (instance 객체)

 


* call by value

- 값 복사

- method의 매개변수가 기본형을 가지면, 값은 복사되어 전달된다.

 

public class CallByValue{
    public void swap(int i, int j){
        int temp = 0;
        temp = i;
        i = j;
        j = temp;
        System.out.println("swap 안 i: " + i + ", j: " + j);	// i = 1, j = 2024
	}
    
    public static void main(String[] args){
        CallByValue cbv = new CallByValue();
        int i = 2024, j = 1;
        System.out.println("swap 전 i: " + i + ", j: " + j);	// i = 2024, j = 1
        t.swap(i, j);
        System.out.println("swap 후 i: " + i + ", j: " + j);	// i = 2024, j = 1
    }
}

728x90