[Java] 메소드 (2)

당당·2023년 4월 20일
0

Java

목록 보기
15/20

📔설명

나의 앱 만들기에서 사용했던 AccountingApp.java에서 메소드를 도입해보자.


🙄이전 AccountingApp.java


public class AccountingApp {

	public static void main(String[] args) {
		double valueOfSupply = 10000.0;
		double vatRate = 0.1;
		double vat = valueOfSupply*vatRate;
		double total = valueOfSupply+vat;
				
		System.out.println("Value of supply : "+valueOfSupply); //공급가
		System.out.println("VAT : "+vat); //부가가치세
		System.out.println("Total : "+total);//소비자가낼돈
	}

}

여기서, vat 값을 구하는 공식valueOfSupply*vatRate이 1억줄이라고 생각해보자. 그러면 vat 값을 구하는 내용을 메소드로 작성해야된다!


🥚메소드 생성



public class AccountingApp {
	public static double valueOfSupply = 10000.0;
	public static double vatRate = 0.1;
	
	public static double getVAT() {
		return valueOfSupply*vatRate;
	}
	
	public static double getTotal() {
		return valueOfSupply+getVAT();
	}
	
	public static void main(String[] args) {
		
		System.out.println("Value of supply : "+valueOfSupply); //공급가
		System.out.println("VAT : "+getVAT()); //부가가치세
		System.out.println("Total : "+getTotal());//소비자가낼돈
	}

}



valueOfSupplyvatRate는 전역변수로 선언해줘야한다.
그리고 앞에 public static을 붙여줘야 에러가 나지 않는다.

이렇게 메소드를 생성하면, 유지보수에 아주아주 도움이 된다.


👞접근 제어자(Access Level Modifier)

class Greeting{
	private static void hi() {
		System.out.println("Hi");
	}
}
public class AccessLevelModifiersMethod {
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Greeting.hi();
	}

}

위의 소스코드는 에러가 뜬다. 왜냐하면 Greeting 클래스 안의 hi()메소드가 private으로 되어있기 때문이다. 그러므로 다른 곳에서 접근을 할 수 없는 것이다.

class Greeting{
	
}
public class AccessLevelModifiersMethod {
	private static void hi() {
		System.out.println("Hi");
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		hi();
	}

}

만약 이렇게, 같은 클래스 안에 있으면 에러가 나지 않는다.

그러므로 아까 첫번째 소스코드에서 에러가 나지 않으려면,

class Greeting{
	public static void hi() {
		System.out.println("Hi");
	}
}
public class AccessLevelModifiersMethod {
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Greeting.hi();
	}

}

이렇게 public으로 설정해주면 에러가 나지 않는다.

public : 다른 클래스에서도 사용 가능
private : 같은 클래스 안에서만 사용 가능

protected : 동일패키지에 속하는 클래스와 하위클래스 관계에서 접근 가능
default : 접근 제어자 생략시

접근 제어자클래스패키지하위 클래스전체
publicOOOO
protectedOOOX
defaultOOXX
privateOXXX

📌static

static이라는 키워드가 붙은 메소드는 클래스의 메소드다.
static이 없는메소드는 인스턴스의 메소드다.


public class staticMethod {
	public static void a(String delimiter) {
		System.out.println(delimiter);
		System.out.println("a");
		System.out.println("a");
	}
	
	public static void b(String delimiter) {
		// TODO Auto-generated method stub
		System.out.println(delimiter);
		System.out.println("b");
		System.out.println("b");
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		a("-");
		b("*");
	}

	

}

성격이 비슷한 메소드들을 정리정돈하는 도구인 클래스a()b()를 묶어보자.
print 라는 클래스를 생성해보자.

class Print{
	public static void a(String delimiter) {
		System.out.println(delimiter);
		System.out.println("a");
		System.out.println("a");
	}
	
	public static void b(String delimiter) {
		// TODO Auto-generated method stub
		System.out.println(delimiter);
		System.out.println("b");
		System.out.println("b");
	}
}
public class staticMethod {
	
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Print.a("-");
		Print.b("*");
	}

	

}

이렇게 하면, Print라는 클래스에 메소드들을 모아둔것이 된다.

하지만 만약,

		Print.a("-");
		Print.b("-");
		
		Print.a("*");
		Print.b("*");

이러한 코드가 1억줄이 넘게 있다고 가정해보자.
그러면 메소드를 호출할 때마다 "-"를 계속 넣어줘야한다.

그러므로 코드를 변경해보자.

Print라는 클래스를 복제시킨 instance이용하자!


class Print{
	public String delimiter;
	
	public void a() {
		System.out.println(this.delimiter);
		System.out.println("a");
		System.out.println("a");
	}
	
	public void b() {
		// TODO Auto-generated method stub
		System.out.println(this.delimiter);
		System.out.println("b");
		System.out.println("b");
	}
}
public class staticMethod {
	
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
//		Print.a("-");
//		Print.b("-");
		
		//instance
		Print t1=new Print();
		t1.delimiter="-";
		t1.a();
		t1.b();
		
//		Print.a("*");
//		Print.b("*");
	
		Print t2=new Print();
		t2.delimiter="*";
		t2.a();
		t2.b();
	}

	

}

t1, t2인스턴스다.


t1.a()를 보면 t1이라는 인스턴스의 소속으로 실행되고 있다.
Print.a("-")는 클래스 Print의 소속으로 실행된 것이다.

즉, t1.a()처럼 메소드인스턴스 소속으로 실행될 때는 static을 빼야한다.
하지만 메소드클래스의 소속일 때는 static이 있어야 한다.

위의 소스코드에서 Print.a();를 하면 오류가 발생한다.
하지만, 아래 소스코드 처럼 수정해보자.


class Print{
	public String delimiter;
	
	public void a() {
		System.out.println(this.delimiter);
		System.out.println("a");
		System.out.println("a");
	}
	
	public void b() {
		// TODO Auto-generated method stub
		System.out.println(this.delimiter);
		System.out.println("b");
		System.out.println("b");
	}
	public static void c(String delimiter) {
		System.out.println(delimiter);
		System.out.println("c");
		System.out.println("c");
	}
}
public class staticMethod {
	
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
//		Print.a("-");
//		Print.b("-");
		
		//instance
		Print t1=new Print();
		t1.delimiter="-";
		t1.a();
		t1.b();
		Print.c("$");
		
//		Print.a("*");
//		Print.b("*");
	
		Print t2=new Print();
		t2.delimiter="*";
		t2.a();
		t2.b();
	}

	

}

그러면 Print.c("$")는 잘 동작하는 것을 볼 수 있다.
Print class 안에서 static키워드가 붙어있기 때문이다.


🕦이후

다음은!
자바의 객체지향 프로그래밍에 대해 공부할것이다.

profile
MySQL DBA 신입 지원

0개의 댓글