코딩 기록들
객체지향 프로그래밍_3. 함수(스택)와 메소드, 인스턴스(힙) 본문
함수
- 호출된 함수는 기능이 끝나면 제어가 반환됨
- 함수정의 : 이름, 매개변수, 반환값, 함수몸체로 구성 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);
}
}