티스토리 뷰

TIL/JAVA

객체지향(OOP)메서드

YEIKKI 2022. 12. 29. 00:10

JVM메모리 구조

참고문헌: 자바의 정석 /저자 남궁 성/도우출판

Method Area

프로그램 실행 중 어떤 클래스가 사용되면 그클래스에 대한 정보(클래스 데이터) 저장 및 클래스변수(CV)를 생성

 

Heap 

프로그램 실행 중 생성되는 인스턴스는 모두 이곳에 생성 , 인스턴수 변수도 (iv) 생성되는 공간

 

Callstack(호출스택) or excution stack

메서드 작업에 필요한 메모리 공간을 제공

메서드가 호출되면 호출스택에 호출된 메서드를 위한 메모리가 할당, 작업을 수행하는 동안 지역변수(매개변수포함)들과 연산의 중간결과 등을 저장하고 사용 . 작업 완료시 메모리공간은 반환되어 비워짐

참고문헌: 자바의 정석 /저자 남궁 성/도우출판


메서드란?                                                                                                                  

-문장들의 묶음(작업단위)                                                                           

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

           

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

                                                                                                            

지역변수(local variable  lv):

메서드 내에 선언된 변수들은 메서드내에서만 사용할수있다. 서로 다른 메서드라면 같은 변수명 사용 가능 

 

인수(argument)와 변수(parameter)

인수 타입/개수 /순서 = 매개변수 타입 /개수 /순서 

 

매개변수 선언시 주의사항

    int add(int x, int y)//ok

    int add(int x, y)//error

메서드 실행 과정

 


반환 타입( return type)

메서드 작업 수행 결과(출력)인 반환값의 타입을 적는다.

단 , 반환값이 없는 경우 반환타입을  'void'를 적어야 한다.

int add(int x, int y) {  
     int result = x +y;
return result;}  //result 반환타입은 int 일치해야함

      반환타입이 있는경우  return 문 생략불가

 void print99danAll(){
    for (int i =1;i<=9;i++){
      for (int j=2; j<=9;j++){
        System.out.print(j+"*"+i+"="+(j*i)+" ");
      }
      System.out.println();
    }

이처럼 void 인 경우 return문 생략가능


기본형 매개변수(read only) Call by Value

package practice;
class Data{ int x;}

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


  }
  static  void change(int x ) {
    x= 10000;
    System.out.println("change():x"+x);
  }


}

참조형 매개변수(read & write) Call by reference

class Data2{int x;}
public class Ex6_7 {
  public static void main(String[] args) {
    Data2 d = new Data2();
    d.x= 10;
    System.out.println("main(): x="+d.x);
    change(d);
    System.out.println("After change(d)");
    System.out.println("main() : x="+d.x);

  }
  static void change(Data2 d){
    d.x=100000;
    System.out.println("change () : x= "+ d.x);
  }

}

 참조형 반환타입

class Data3{int x;}

public class Ex6_8 {
  public static void main(String[] args) {
    Data3 d = new Data3();
    d.x=10;

    Data3 d2=copy(d);

    System.out.println("d.x="+d.x);
    System.out.println("d2.x="+d2.x);

  }
  static Data3 copy(Data3 d){
    Data3 tmp= new Data3();
    tmp.x=d.x;
    return tmp;
  }
}

Static메서드 인스턴스 메서드
객체생성없이 '클래스명.메서드명();' 으로 호출
인스턴스 멤버(iv,im)와 관련없는 작업을 하는 메서드
메서드내에서 iv 사용불가
인스턴스메서드 호출불가

Static을 언제 붙여야할까?
-클래스 멤버변수 중 모든 인스턴스에 공통값을  유지해야하는것이 있는지 보고 static붙임

-메서드 중에 인스턴스 변수나 인스턴스 메서드를 사용하지 않은 메서드에 static 붙일 것을 고려한다.
인스턴스 생성후' 참조변수.메서드명();' 으로 호출
인스턴스 멤버(iv,im) 와 관련된 작업을 하는 메서드
메서드내에서 iv사용가능

 

class MyMath{
long a ,b ;

long add(){ return a + b;)//인스턴스 변수 a,b만을 이용해서 작업하므로 매개변수가 필요없다.


//인스턴스 변수와 관계없이 매개변수만으로 작업이 가능하다.
static  long add(long  a, long b){return a+b; }  // a,b는 지역변수


}

class Test {
public static void main(String arg[]) {
//클래스 메서드 호출 .인스턴스 생성없이 호출가능
System.out.println(MyMath.add(100L,200L));
// 인스턴스 메서든 객체생성 후에만 호출이 가능함
Mymath m= new Mymath();
m.a= 100L;
m.b= 200L;
System.out.println(m.add());

}

메서드 오버로딩

하나의 클래스에 같은 이름의 메서들를 여러 개 정의하는 것을 메서드 오버로딩이라고함

오버로딩의 조건

메서드명이 같아야 한다.

매개변수의 개수 또는 타입 달라야 한다.

매개변수는 같고 리턴타입이 다른 경우는 오버로딩이 성립되지 않는다, 따라 위 원칙을 주의해서 오버로딩을 하자!


참고문헌 :남궁성, 『자바의정석』, 도우출판

'TIL > JAVA' 카테고리의 다른 글

객체지향(OOP)다형성  (0) 2023.01.09
객체지향(OOP)상속  (0) 2023.01.06
객체지향(OOP)Part1요약  (0) 2022.12.26
배열  (0) 2022.12.23
제어문  (0) 2022.12.22