나의 앱 만들기
에서 사용했던 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
키워드가 붙어있기 때문이다.
다음은!
자바의 객체지향 프로그래밍에 대해 공부할것이다.