코딩 기록들

객체지향 프로그래밍_3. 함수(스택)와 메소드, 인스턴스(힙) 본문

카테고리 없음

객체지향 프로그래밍_3. 함수(스택)와 메소드, 인스턴스(힙)

코딩펭귄 2023. 12. 6. 20:33

함수

- 호출된 함수는 기능이 끝나면 제어가 반환됨

- 함수정의 : 이름, 매개변수, 반환값, 함수몸체로 구성 ex) int add(int num1, int num2) {~~ return result;}

- 스택 : 함수가 호출될 때 지역변수들이 사용하는 메모리 (= 함수 수행이 끝나면 자동반환됨)

 

메소드

- 클래스 내부에 구현되는 함수(객체의 기능 구현을 위함)

-- 클래스의 속성을 멤버변수로 선언하고, 메소드를 구현한다

- = 멤버함수라고도 함

- 메소드 이름은 객체를 '사용하는' 클라이언트에 맞게 짓는것이 좋음

메소드 선언
리턴타입 메소드이름 ( [매개변수 선언, ..] ) {
                            실행할 코드
}
리턴타입

- 리턴타입 = 리턴값 : 메소드를 실행한 후의 결과값(있을수도, 없을수도 있음)

- 리턴값이 있는 메소드 -> 리턴값의 타입을 기술 -ex) double devide(int x, int y){}

- 리턴값이 없는 메소드 -> void 로 기술 - ex) void powerOn(){}

메소드 이름

- 숫자로 시작하면 안됨, $_제외한 다른특수문자 사용하면안됨

- 관례적으로 소문자로 작성(카멜표기법따름)

- 기능을 알려줄수있는 이름으로 작성

매개변수 선언

- 매개변수 : 메소드가 실행할때 필요한데이터를 외부로부터 받기위해 사용

매개변수의 개수를 모를경우

- 메소드선언시 매개변수 개수 모를경우 : 매개변수를 배열타입으로 선언함

ex) int sum1(int[] values) {} 

 

리턴문

리턴값이 있는 메소드

- 메소드 선언시 리턴타입있는메소드 = 반드시 리턴문 사용해서 리턴값 지정해야됨(return문 없으면 컴파일에러 발생)

- return문 실행되면 메소드는 즉시종료됨

리턴값이 없는 메소드

- 리턴값이 없는 메소드 : void를 리턴타입으로 사용함

- void로 선언된 메소드에서도 return문 사용할수있음 = 메소드 실행을 즉시 강제종료 시키는 역할을 함

 

메소드 호출

- 메소드는 클래스 외, 내부의 호출에 의해 실행됨

- 클래스 내부의 다른 메소드에서 호출될 경우 : 메소드 이름으로 호출

- 클래스 외부에서 호출할 경우 : 1) 클래스로부터 객체 생성 -> 2) 참조변수 이용하여 메소드 호출

객체 내부에서 호출

- 메소드가 매개변수 가지고있을경우 : 매개변수의 타입+수에 맞게 매개값 제공

- 리턴값이 있는 메소드 호출하고 리턴값 받고싶다면 : 타입변수 = 메소드(매개값, ...); 

객체 외부에서 호출 

1) 클래스로부터 객체를 생성

 클래스 참조변수 = new 클래스 ( 매개값, ...); 

2) 도트연산자(객체접근연산자)를 사용해서 메소드 호출

 참조변수.메소드( 매개값, ...);  or  타입변수 = 참조변수.메소드( 매개값,... ); 

메소드 오버로딩

- 클래스 내 같은 이름의 메소드를 여러개 선언하는것

- 조건 : 매개변수의 타입, 개수, 순서 중 하나가 달라야함

 

 

인스턴스

- 클래스 기반으로 생성된 객체 = 인스턴스 는 각각 다른 멤버변수값을 가지게됨

- new키워드를 사용하여 인스턴스 생성

- 생성된 인스턴스는 동적메모리(힙메모리)에 할당됨

- 하나의 클래스로부터 여러개 인스턴스가 생성되고, 각각 다른 메모리주소를 가지게됨

 

 

예제

package chapter02.ch04;

public class Student {

    //3개의 속성 가지고 있음
    public int studentID;
    public String address;
    public String studentName;

    //학생의 정보를 보여주는 메서드, 반환값은 없음
    public void showStudentInfo() {
        System.out.println(studentID + "학번 학생의 이름은" + studentName + "이고, 주소는 " + address + "입니다.");
    }
    // 이름을 반환하는 함수
    public String getStudentName() {
        return studentName;
    }

    // 학생의 이름을 지정하거나 가져올 수 있음
    public void setStudentName(String name) {
        studentName = name;
    }
}
package chapter02.ch04;

public class StudentTest {

    public static void main(String[] args) {

        //데이터타입이 Student 클래스를 기반으로 함. 클래스를 기반으로 생성되는 인스턴스들!
        Student studentLee = new Student(); //생성자 new = student하나를 생성해라! -> '힙'이라는 메모리에 들어가게됨
        studentLee.studentID = 12345;
        studentLee.studentName = ("Lee");
        studentLee.address = "서울";

        studentLee.showStudentInfo();


        Student studentKim = new Student();
        studentKim.studentID = 54321;
        studentKim.studentName = "Kim";
        studentKim.address = "경주";

        studentKim.showStudentInfo();

        System.out.println(studentLee); // 힙의 참조값(힙 메모리의 가상주소) chapter02.ch04.Student@3feba861
        System.out.println(studentKim);
    }

}