본문 바로가기
JAVA

JAVA_객체지향 프로그래밍2(변수, 메서드)

by haheaven 2021. 7. 28.

- 변수와 메서드 

 

 

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

- 변수의 종류

 

인스턴스변수(클래스 영역) - 인스턴스가 생성되었을 때

: 인스턴스는 독립적인 저장공간을 가지므로 서로 다른 값 

  인스턴스마다 고유한 상태를 유지해야하는 속성의 경우 선언 

  ex) 아이폰12 mini의 경우, 크기는 모두 같아야하지만 색상은 흰, 검, 연두....다양하며, 유저 또한 다름 

 

클래스변수(클래스 영역)   - 클래스가 필요할 때 만듦

: 인스턴스 앞에 'static'을 붙이면 선언 가능 

  클래스변수는 모든 인스턴스가 공통된 저장공간(변수)를 공유

  한 클래스의 모든 인스턴스들이 공통적인 값을 유지해야하는 속성의 경우, 클래스 변수로 선언 

  ex) 아이폰12 mini의 경우, 크기는 모두 같아야함 이때 크기는 클래스 변수로 선언

** 인스턴스 변수는 인스턴스가 생성될 때 마다 생성되므로 인스턴스마다 각기 다른 값을 유지할 수 있지만,

     클래스 변수는 모든 인스턴스가 하나의 저장공간을 공유하므로, 공통값 가짐.

지역변수(클래스 외 영역) - 변수 선언문이 수행되었을 때 

: 매서드 내에 선언되어 메서드 내에서만 사용 가능, 메소드 종료시 자동 소멸

 

 

 

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

- 예제(자바의 정석Ex6_5 변형)

: 맥북에어를 사용하는 두사람이 있다.

고정 값은 모델명  'air'와 무게 1.3 으로 일치 --> class variable

하지만 사용자나 색상은 다름 --> instance variable

class MacBook {
  public static void main(String[] args){
   System.out.println("Mac.model : " + Mac.model);
   System.out.println("Mac.weight : " + Mac.weight);

   Mac m1 = new Mac();
   m1.color = "silver";
   m1.user_name = "haheaven";

   Mac m2 = new Mac();
   m2.color = "black";
   m2.user_name = "hahaha";
   
   System.out.printf("m1의 color는 %s이고, user_name은 %s이다.%n", m1.color, m1.user_name);
   System.out.printf("m2의 color는 %s이고, user_name은 %s이다.%n", m2.color, m2.user_name);

   System.out.println("Mac의 모델을 변경합니다.");
   
   Mac.model = "pro";
   System.out.printf("m1의 model은 %s이다.%n", m1.model);    //참조변수(c1)을 통해서도 호출 가능 
   System.out.printf("m2의 model은 %s이다.%n", Mac.model);   
//참조변수보다 클래스이름으로 호출하면 model변수가 클래스변수임을 확인할 수 있기 때문에 클래스이름으로 호출하는 것이 좋다!

 }
}

class Mac {
   //인스턴스변수 
  String color;
  String user_name;
   //클래스변수 ===> 공통적인 속성의 경우 static + 인스턴스변수로 선언 
  static String model = "air";
  static double weight = 1.3;

  }

* 위의 코드를 그림으로 과정을 살펴보면 ,

 

 

 

 

3. 메서드

: 특정 작업을 수행하는 일련의 문장들으 하나로 묶은 것(작업단위 문장 묶는 것)

: 입력 - > 출력을 통해 필요한 값 넣고 결과 얻는 과정

- 메서드 사용이유

① 높은 재사용성 : API에서 제공하는 메서드 사용하면서 한 번 만들어 놓은 메서드를 호출 가능

② 중복코드 제거 : 반복되는 코드를 하나의 메서드로 작성해 놓으면 메서드 호출로 대신 가능

③ 프로그램의 구조화 : 큰 프로그램 만들시 단위별로 나눠 프로그램 구조를 단순화함

- 관련 개념

① 매개변수(parameter) : 메서드가 작업을 수행하는데 필요한 값들을 제공받기 위한 것 

② 메서드 이름 : 메서드의 기능을 알 수 있도록 의미 함축하기

③ 반환타입 : 출력결과 반환값 타입을 적어야하는데 반환값이 없는 경우에는 'void' 를 적어야함

④ 메서드의 몸통 {} : 메서드를 호출했을 때 수행될 문장

⑤ return 문 : 'void'가 아닌 경우 메서드 몸통{}안에 return 반환값이 존재해야함

 

⑥ 지역변수 : 매서드 내에 선언된 변수들은 그 메서드 내에서만 사용 가능 

add()와 divide() 에서 매개변수 x,y가 같지만 각 다른 메서드이기 때문에 이름이 같아도 상관없음(다른 변수니까)

int add(int x, int y) {
   return x+y;
   }
   
int divide(int x, int y){
    return x/y;
    }

 

- 메소드 관련 예제(자바의정석 Ex6_6 변형)

class Calculator{
 public static void main(String[] args){
    // c1 객체 생성 
   Calculator c1 = new Calculator();
   int result1 = c1.add(7,3);
   int result2 = c1.subtract(7,3);
   int result3 = c1.multiply(7,3);
   double result4 = c1.divide(7,3);
   
   System.out.println("c1.add : " + result1);
   System.out.println("c1.subtract : " + result2);
   System.out.println("c1.multiply : " + result3);
   System.out.println("c1.divide : " + result4);
 
   }
 }
 // 클래스 생성 
 class Calculator {
    // 지역변수 
    int x;
    int y;
    //더하기 메소드
     int add(int x, int y){
        return x+y;
        }
     //빼기 메서드
     int subtract(int x, int y) { return x-y;   }
     //곱하기 메서드 
     int multiply(int x, int y) { return x*y;   }
     //나누기 메서드
     double divide(double x, double y) { return x/y;   }

그림으로 나타내면

 

 

 

 

 

 

 

 

 

 

참고 : 자바의 정석(남궁성)

 

댓글