나의 앱 만들기에서 사용했던 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());//소비자가낼돈
}
}

valueOfSupply와 vatRate는 전역변수로 선언해줘야한다.
그리고 앞에 public static을 붙여줘야 에러가 나지 않는다.
이렇게 메소드를 생성하면, 유지보수에 아주아주 도움이 된다.
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 : 접근 제어자 생략시
| 접근 제어자 | 클래스 | 패키지 | 하위 클래스 | 전체 |
|---|---|---|---|---|
| public | O | O | O | O |
| protected | O | O | O | X |
| default | O | O | X | X |
| private | O | X | X | X |
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키워드가 붙어있기 때문이다.
다음은!
자바의 객체지향 프로그래밍에 대해 공부할것이다.