[Java] 3. 메서드와 클래스

Kyunghwan Ko·2022년 9월 25일
0

Java

목록 보기
4/14

01. 메서드(method)

메서드(함수)

  • 메서드(함수): 입력(인수, 파라미터)을 받아서 처리하거나 결과를 반환하는 것
  • 메서드는 메모리에서 반드시 4 byte를 차지한다
  • JVM은 반드시 main method를 가장 먼저 실행한다.
  • 메서드(참조형)은 메모리에서 주소값을 가진다.
    • 참조형은 heap 메모리에 저장됨 → 휘발성이라서 사용 후 사라짐

1) 메서드의 사용: 함수이름(인자);

A. 메서드 정의

public static void hiEveryone(int age){
		System.out.println("좋은 아침입니다");
    System.out.println("제 나이는 "+age+"세 입니다".);
}
  • age는 매개변수(parameter)

B. 메서드 호출

public static void main(String[] args) {
	hiEveryone(20);
	}
  • 20은 인자(argument, 전달인자)

C. 메서드 종류

  1. void/return
    a. void 메서드: 결과값을 반환하지 않는 메서드(return이 없음)
    -> 함수명 앞에 데이터 타입을 void로 설정
    b. return 메서드: 결과값을 반환하는 메서드(return 값이 있음)
    -> 함수명 앞에 return 값의 데이터 타입을 적어줌
public double circleArea(double radius){
	return Math.PI*radius*radius;
}
  1. 클래스 타입/ 인스턴스 타입
    a. 클래스 타입: static이 붙은 경우
    b. 인스턴스 타입: static이 붙지 않은 경우

2) 메서드 관련 예제

  • 메모리에서 어떻게 처리되는지 유의하기

A. 글자 출력하기

public static void printString(String str){
	// 2번
	System.out.print(str);
}

public static void main(String[] args){

    // 1번
    String str1 = "Happy";

    // 2번
    printString(str1);
}

코드의 순서에 따라 1번, 2번 흐름으로 진행되는 것을 메모리로 표현해보겠다.

  • 1번이 실행되면 str1가 메모리에 형성되고, String pool에 Happy 리터럴이 올라감 그리고 str1 값에 Happy의 주소값이 할당됨
  • 2번이 실행되면 str가 형성되고 String pool에 이미 존재하는 Happy의 주소값이 할당됨
    -> 그 후 main에서 Happy라는 값을 뿌려주면 메모리에서 str은 사라짐

B. 사각형 넓이 구하기

코드1

class Rectangle {
	double width;
	double height;

	public void setWidth(double widNum) {
		width = widNum;
	}
	public void setHeight(double heiNum) {
		height = heiNum;
	}

	public double getArea() {
		return width * height;
	}

}

public class Example4 {

	public static void main(String[] args) {

        // 1번
        Rectangle rec = new Rectangle();

        rec.setWidth(10);
		rec.setHeight(10);

		System.out.println(rec.getArea());

        // 2번

		rec.setWidth(20);
		rec.setHeight(20);

		System.out.println(rec.getArea());

	}

}

  • rec.setWidth(20)이 되면 setWidth()의 시작번지로 가서 width의 값을 20으로 바꾼다

코드2

class Rectangle {

	double width;
	double height;

	public void setWidth(double widNum) {

		width = widNum;
	}

	public void setHeight(double heiNum) {

		height = heiNum;
	}

	public double getArea() {
		return width * height;
	}

}

public class Example4 {

	public static void main(String[] args) {
		Rectangle rec = new Rectangle();
		Rectangle rec2 = rec;

		rec2.setWidth(10);
		rec2.setHeight(10);

		System.out.println(rec2.getArea());
		System.out.println(rec.getArea());

	}

}
  • rec와 rec2는 똑같은 주소 값을 가진다
    -> rec를 이용해 값을 변경하는 경우, rec2를 이용해 변경하는 경우 모두 Heap영역에 올라긴 Rectangle에 있는 값을 변경한다
  • new Rectangle(): heap 메모리영역에 Rectangle를 올린다
    -> 인스턴스(객체) 형성

코드3

class Rectangle {

	double width;
	double height;

	public void setWidth(double widNum) {

		width = widNum;
	}

	public void setHeight(double heiNum) {

		height = heiNum;
	}

	public double getArea() {
		return width * height;
	}

}

public class Example4 {

	public static void main(String[] args) {
		Rectangle rec = new Rectangle();
		Rectangle rec2 = new Rectangle();

    	rec.setWidth(10);
		rec.setHeight(10);

		rec2.setWidth(20);
		rec2.setHeight(20);

		System.out.println(rec.getArea());
		System.out.println(rec.getArea());

	}

}
  • 생성자 및 new키워드를 이용하여 rec, rec2에 각각 별도의 인스턴스 할당
    -> rec를 이용해 값을 변경해도 rec2에게 아무영향이 없다.

클래스와 객체

클래스에 대한 이해

클래스는 설계도이고 객체는 그 설계도(클래스)로 만들어낸 제품이다.

클래스 정의 후 객체 생성

클래스를 정의 후 객체를 생성하는 과정은 아래와 같다.

  1. 클래스를 정의한다.
  2. 클래스를 참조할 참조 변수를 생성한다.
  3. 객체를 생성한다.
  4. 객체의 필드에 접근해서 변수를 넣어준다.
    (직접 필드에 접근해서 값을 조작하는 방식은 잘 사용하지 않음)
  5. 객체의 매소드에 접근한다.

객체는 메모리로 설명하는게 가장 깔끔하다…!!!

참조 변수 선언시 일어나는 일

Circle obj;

메모리에 저장되는 참조형에 대한 값

  • 4Byte, 주소 값
    → 4Byte인 이유 : JVM 이 기본적으로 32bit 로 설계되었기 때문이다.
  • 참조 변수를 선언함과 동시에 스택 메모리에 obj라는 영역을 설정하게되고 null값으로 채워넣는다.

객체 생성

obj = new Circle();

  • 객체를 생성함과 동시에 OS가 Circle클래스를 Heap 메모리 영역에 올린다
    • 함수는 입력 파라미터 변수들 + 지역 변수들 + 리턴타입 변수의 크기만큼을 할당된다.
    • 나머지 타입은 각 데이터 타입의 byte에 따라 할당된다.
profile
부족한 부분을 인지하는 것부터가 배움의 시작이다.

0개의 댓글