[JAVA] 변수와 메소드

용용학생·2024년 4월 13일

자바

목록 보기
13/32

변수의 종류

변수에는 선언위치에 따라 4가지로 구분될 수 있다.

  • 인스턴스 변수
  • 클래스 변수(static 변수)
  • 지역변수
  • 매개변수

인스턴스 변수

  • 클래스 영역에 선언되며, 클래스의 인스턴스가 생성될 때 만들어진다
  • 각 인스턴스마다 독립적인 저장공간을 가지기 떄문에 서로 다른 값을 저장한다
  • 인스턴스를 생성해야지만 인스턴스 변수를 사용할 수 있다
  • 인스턴스마다 고유한 상태를 유지해야하는 속성일 때, 인스턴스 변수 사용
  • 클래스_인스턴스.인스턴스_변수의 형태로만 접근 가능하다
  • 초기화하지 않으면 기본값으로 초기화된다

클래스 변수

  • 인스턴스 변수와 같이 클래스 영역에서 선언된다
  • 인스턴스 변수 앞에 static을 붙이면 클래스 변수로써 선언된다
  • 그 클래스의 모든 인스턴스가 공유하는 저장공간으로써의 역할을 한다
  • 클래스의 인스턴스를 만들지 않고도 접근이 가능하다
  • 클래스_이름.클래스_변수의 형태로도 접근이 가능하다
    • 인스턴스 변수의 형태처럼 접근도 가능
  • 초기화하지 않으면 기본값으로 초기화된다

지역 변수

  • 메소드 내에 선언되며, 메소드 내에서만 사용 가능하다
  • 메소드가 종료되면 사용할 수 없다
  • for 문이나 while 문의 블럭 내에서 선언된 지역 변수는 블럭을 벗어나면 사용이 불가능하다
  • 인스턴스 변수나 클래스 변수와 달리 초기화를 무조건 해주어야 한다

매개 변수

  • 메소드 호출 시 전달하는 값을 가지는 변수이다
  • 메소드의 선언부에서 선언되며, 메소드 내에서만 유효하다
  • 메소드 안에서 선언되기 때문에 지역 변수에 포함하기도 한다

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

포커 카드라는 객체를 만들기 위해서는 먼저 속성과 기능을 알아야 한다.

포커 카드의 속성으로는 카드의 높이, 너비, 숫자, 무늬가 있을 것이다.

이 때, 카드의 숫자와 무늬는 각각의 카드(인스턴스)마다 다르겠지만,
카드의 높이와 너비는 항상 동일해야 한다.

각 인스턴스마다 동일한 속성은 굳이 인스턴스 변수로 만들어 메모리를 차지할 필요가 없기 때문에 클래스 변수로 선언하면 된다.

class PokerCard {
	static int width = 100;
    static int height = 250;
    
    int number;
    String kind; 
}

public class Main {
	public static void main(String[] args) {
    	System.out.println("카드의 너비" + Card.width);
        System.out.println("카드의 높이" + Card.height);
        
        Card c1 = new Card();
        c1.number = 7;
        c1.kind = "Heart";
        
        Card c2 = new Card();
        c2.number = 3;
        c2.kind = "Spade";
        
        System.out.println("c1의 카드는 " + c1.kind + c1.number + "입니다.");
        System.out.println("c2의 카드는 " + c2.kind + c2.number = "입니다.");
        
        // 모든 카드의 크기 변경
        Card.width = 50;
        Card.height = 100;
        // 전부 동일한 결과를 만들어냄
        // c1.width = 50; 
        // c1.height = 100;
        
        // c2.width = 50; 
        // c2.height = 100;

인스턴스 변수는 각 인스턴스마다 생성되는 값이어서 서로 다른 값이지만,
클래스 변수는 인스턴스가 모두 공유하는 값이기에 항상 공통된 값이다

메소드

메소드는 특정 작업을 수행하는 클래스 내에 작성된 일련의 문장들의 묶음이다.

클래스에서 기능을 표현하는 부분이 이 메소드이다.

메소드는 크게 두 부분, 선언부구현부로 나누어진다.
메소드를 정의한다는 것은 선언부구현부를 작성하는 것을 뜻하고 다음과 같은 형식으로 정의한다.

[접근제어자] [기타제어자] 반환타입 메소드이름([타입 변수명], ...) {
	// 메소드 호출 시 실행될 코드
    return 반환타입에 맞는 반환값;
}

선언부

[ ] 안에 있는 것들은 선택적인 부분이다.

접근제어자와 기타제어자에 대해서는 다른 글에서 상세히 알아보자.

반환타입(return type)

  • 메소드의 작업수행 결과인 반환값(return type)의 타입을 적는다
  • 반환값이 없는 경우 void를 적어야 한다
  • 정수의 합을 구해주는 sum( )이란 메소드가 있다면 정수의 합의 연산을 수행한 결과를 반환해주어야 하기 때문에 int가 될 것이다

메소드 이름

  • 변수의 명명규칙을 따른다
  • 'add'나 'isTrue' 같이 동사의 형태로 적는 경우가 일반적이다
  • 이름만으로도 메소드의 기능을 알 수 있도록 명명을 하는 것이 좋다

매개변수 선언

  • 메소드가 수행하는 데 필요한 값들을 제공받기 위한 것이다
  • 필요한 값의 개수만큼 매개변수를 선언할 수 있고, ,(쉼표)로 구분한다

구현부

괄호{ } 안에 있는 것을 메소드의 구현부라고 한다.
메소드를 호출했을 때 수행될 문장들을 넣는다.

return 문

  • 구현부 안에 return 반환값;이 포함되어있어야 한다
    • 반환 타입이 void인 경우에는 생략 가능하다 (컴파일러 자동 추가)
  • 반환값은 반환타입과 일치하거나 자동 형변환이 가능한 것이어야 한다
  • 메소드는 단 하나의 값만 반환할 수 있기에 return문은 하나의 값만 허용된다
	int add(int x, int y) {
    	int result = x + y;
        return result;
    }

선언부의 리턴타입이 int로 선언되었고
구현부의 return 문 뒤에 int타입의 변수 result 가 작성되었다.

	double add(int x, int y) {
    	int result = x + y;
        return result;
    }

double로 반환 타입을 선언하고 int 타입으로 반환하는 코드이다.
반환 타입과 반환 값이 일치하지 않지만 자동 형변환이 가능하기에 오류가 없다.

호출

정의된 메소드를 수행하려면 그 메소드를 호출해야 한다.

호출하는 방법은 메소드이름( )으로 호출할 수 있고,
정의된 메소드의 매개변수와 일치하는 인자들의 개수와 타입을 적어주어야 한다

class SumOperation {
	int sum(int x, int y) {
    	int result = x + y;
        return result;
    }
}

public class Main {
	public static void main(String[] args) {
    	SumOperation so = new SumOperation();
        
        int total = 0;
        total = so.sum(3, 5);
        // total = so.sum(3.0, 5.0); // 타입이 틀린 경우
        // total = so.sum(3, 5, 6); // 개수가 틀린 경우
        
        System.out.println(total);
    }
}

위의 so.sum(3, 5) 처럼 선언된 메소드의 매개변수의 타입과 개수를 일치시켜서 메소드를 호출할 수 있다.

만약 메소드에 선언된 매개변수보다 개수가 많거나 타입이 다르다면 컴파일러 에러가 난다.

profile
자바 스프링 공부하는 정리 블로그!

0개의 댓글