본문 바로가기
Develope_Web&App/01_Java & JavaFX

[Java의 정석] 객체지향 1-1

by 스타트업_디벨로퍼 2021. 2. 3.

선언 위치에 따른 변수의 종류

class Variables {

	//클래스영역에서는 선언문만 가능!!
	int iv; // 인스턴스 변수
    static int cv; //클래스 변수(staic 변수, 공유 변수) 
    
    void method()
    {
    	int lv = 0; // 지역 변수
    }


}

-> 인스턴스 변수가 인스턴스 생성되었을 때(객체가 생성될때) 생성된다는 게 젤 중요!! 

클래스를 쓰려고 할때 클래스 변수가 생성된다!! (CPU 와 RAM하고만 작업한다. ssd의 파일을 램에 올린다., 파일을 ssd에 넣는 것을 save )

 

 

클래스 변수와 인스턴스 변수

class Card {
	String kind; //객체마다 다르게 유지되어야 함!! 
    int number;
    
    static int width = 100; // 공통값, 유지되어야 하는 값
    static int height = 250; //공통값
}

Card c = new Card();
c.kind = "HEART";
c.number = 5;

Card.width = 200; //클래스 변수에는 클래스 이름 붙이는 게 좋다!! 
Card.height = 300;

 

메서드?

문장들을 묶어 놓은 것!!  중복을 방지할 수가 있다!! 

- 중복코드 제거, 관리 용이, 재사용 가능! 

 

1. 문장들을 묶은 것

2. 값(입력)을 받아서 처리하고, 결과를 반환(출력) 

-> 함수와 유사하다!!!
(메서드는 객체지향에서 함수 지칭, 메서드는 클래스 안에 있어야함. 함수는 독립적이다! ) 

 

 

- 코드의 중복을 줄일 수 있다.

- 코드의 관리가 쉽다. 

- 코드를 재사용할 수 있다.

- 코드가 간결해서 이해하기 쉬워진다.

- 메서드는 한가지 기능만 수행하도록 작성! 

 

메서드의 선언과 구현

반환타입 메서드이름 ( 타입 변수명, 타입 변수명, ---) 
{ 
	//메서드 호출 시 수행될 코드
}

 

메서드의 호출

 

메서드 이름(값1, 값2, ...);

print99danAll(); //void print99daAll()을 호출

int result = add(3,5); //int add(int x, int y)를 호출하고, 결과를 result에 저장

 

package chap06;

public class Ex6_4 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		MyMath mm = new MyMath(); //클래스 먼저 선언 -> 객체 생성
		
		long result1 = mm.add(5L,3L); //메서드 호출 
		long result2 = mm.subtract(5L,3L);
		long result3 = mm.multiply(5L,3L);
		long result4 = mm.divide(5L,3L);
		
		System.out.println(result1);
		System.out.println(result2);
		System.out.println(result3);
		System.out.println(result4);
	}

}

 class MyMath { // 클래스 작성
	 long add (long a, long b) {
		 long result = a+b;
		 return result;
	 }
	 long subtract (long a, long b) {
		 long result = a-b;
		 return result;
	 }
	 long multiply (long a, long b) {
		 long result = a*b;
		 return result;
	 }
	 long divide (long a, long b) {
		 long result = a/b;
		 return result;
	 }
 }

-> 타입 변환에 주의하고!!!, void가 아닌 경우 무조건 return이 되야한다!

 

JVM의 메모리 구조

 

호출 스택(call Stack)

- 호출 스택은 메서드의 작업에 필요한 메모리 공간을 제공한다. 메모리가 호출되면, 호출스택에 호출된 메서드를 위한 메모리가 할당되며, 이 메모리는 메서드가 작업을 수행하는 동안 지역변수들과 연산의 중간결과 등을 저장하는데 사용된다. 그리고 메서드가 작업을 마치면 할당되었던 메모리공간은 반환되어 비워진다.

 

스택(stack) :밑이 막힌 상자. 위에 차곡차곡 쌓인다. 

메서드 수행에 필요한 메모리가 제종되는 공간

메서드가 호출되면 호출스택에 메모리 할당, 종료되면 해제! 

 

호출 스택의 특징

-  메서드가 호출되면 수행에 필요한 만큼의 메모리를 스택에 할당받는다.

- 메서드가 수행을 마치고 나면 사용했던 메모리를 반환하고 스택에서 제거된다.

- 호출스택의 제일 위에 있는 메서드가 현재 실행 중인 메서드이다.

- 아래에 있는 메서드가 바로 위의 메서드를 호출한 메서드이다.

 

 

 

기본형 매개변수와 참조형 매개변수

 

기본형 매개 변수 : 변수의 값을 읽기만 할 수 있다. (read only)

참조형 매개 변수 : 변수의 값을 읽고 변경할 수 있다. (read & write) 

 

class Data {int x;}

public class ReferenceParaEx {
	public static void main(String[] args) {
	
	Data d = new Data();
	d.x = 10;
	System.out.println("main() : x = " + d.x);
	
	change(d);
	
	System.out.println("Afater change(d)");
	System.out.println("main() : x = " + d.x);
	 
	}
	static void change( Data d ) {
		d.x = 1000;
		System.out.println("change() : x = "+d.x  );
	}
}

main() : x = 10
change() : x = 1000
Afater change(d)
main() : x = 1000

 

참조형 반환 타입

class Data {int x;}

public class ReferenceParaEx {
	public static void main(String[] args) {
	
	Data d = new Data();
	d.x = 10;
	Data d2 = copy(d);
	System.out.println("d.x = " + d.x);
   
	System.out.println("d2.x = " + d2.x);
	
	static void change( Data d ) {
		Data tmp =  new Data();
        tmp.x= d.x;
        return tmp;
    }
}

1. copy 메서드를 호출하면서 참조변수 d의 값이 매개변수 d에 복사된다.

2. 새로운 객체를 생성한 다음, d.x에 저장된 값을tmp.x에 복사한다.

3. copy 메서드가 종료되면서 반환한 tmp의 값은 참조변수 d2에 저장된다.

4. copy메서드가 종료되어 tmp가 사라졌지만, d2로 새로운 객체를 다룰 수 있다.

 

"반환타입이 '참조형'이라는 것은 메서드가 '객체의 주소'를 반환한다는 것을 의미한다."

 

반응형

'Develope_Web&App > 01_Java & JavaFX' 카테고리의 다른 글

[Java의 정석] 객체지향 2-2  (0) 2021.02.04
[Java의 정석] 객체지향 2- 1상속  (0) 2021.02.03
[Java의 정석] 객체 지향 1  (0) 2021.02.03
[java] string 변환시키기  (0) 2021.01.27
[java] 예외처리  (0) 2021.01.27