top of page

기초 다시 시작

1. 전역변수, 지역변수

 

main() 메소드 외에 사용자가 추가하거나 만들어 놓은 메소드를 호출하여 사용할 때 파라미터를 넘길 수도 있고 메소드의 실행 결과를 Return을 통해 되돌려 받을 수도 있다. 전역변수는 모든 메소드에서 사용되는 반면 지역변수는 자기 메소드 내에서만 사용된다.

(참고, 또한 클래스에서 사용되는 변수는 멤버변수라고 하며 전역변수로 사용된다)

 

 

2. 정적 필드, 정적 메소드, 상수 필드

 

클래스의 인스턴스를 생성한 후에 변수를 사용하려면 클래스에 변수가 선언되어 있어야 한다. 

인스턴스를 생성하지 않고도 클래스의 변수나 메소드를 사용할 수 있는 방법으로 static 키워드를 붙이는 방법이 있다.

이 방법을 사용하면 "클래스명.메소드명()" 처럼 직접 호출하여 사용할 수 있다.

정적 필드에 final을 붙이면 상수가 된다.

 

 

3. 클래스와 인스턴스

 

누군가 만들어 놓은 클래스를 사용해 보자.(출처, 한빛아케데미 Android Studio를 활용한 안드로이드 프로그래밍 책자) 

 

■ Car.java

 

  public class Car {
    String color;
    int speed = 0;
    
    int getSpeed() {    
//getSpeed()를 호출하면 현재 speed값을 보내줌
        return speed;  //내외부에 의해 speed가 변경되었을 수도 있다.
    }

    void upSpeed(int value) {   //void는 리턴하는 값이 없음을 의미
        if (speed + value >= 200)
           speed = 200;
        else
           speed = speed + value;
    }

    void downSpeed(int value) {   //void는 리턴하는 값이 없음을 의미
        if (speed - value <= 200)
           speed = 0;
        else
           speed = speed - value;
    }

    String getColor() {
        return color;  
//getColor()를 호출하면 현재 color값을 보내줌
    }
  }

 

 

■ Example.java

 

  public class Example {
    public static void main(String args[]) {
        Car myCar1 = new Car();
 //Car클래스를 myCar1으로 사용하겠다.
        myCar1.color = “빨강”;
        myCar1.speed = 0;

        Car myCar2 = new Car(); //Car클래스를 myCar2로 사용하겠다.
        myCar2.color = “파랑”;
        myCar2.speed = 0;

        Car myCar3 = new Car(); //Car클래스를 myCar3로 사용하겠다.
        myCar3.color = “초록”;
        myCar3.speed = 0;

        myCar1.upSpeed(50); //이 upSpeed(50)를 실행해도 아무일 없음.
        System.out.println(“자동차1의 색상은 ” + myCar1.getColor()
               + “이며, 속도는 ” + myCar1.getSpeed() + “km입니다.”);
         
//getColor()를 실행하면 현재 color변수에 들어있는 값을 보내줌
          //getSpeed()를 실행하면 현재 speed변수에 들어있는 값을 보내줌

        myCar1.downSpeed(20);
        ~~~~~ 중간 생략 (myCar2 내용 출력) ~~~~
        myCar3.upSpeed(250);
        ~~~~~ 중간 생략 (myCar3 내용 출력) ~~~~
    }
  }

 

 

4. 생성자

 

변수에 일일이 입력하지 말고 클래스에 생성자를 만들어 놓은 후에 객체 생성하면서 변수에 값을 대입해 보자. 클래스에 생성자(특히 생성자 메소드)를 만들 때는 클래스이름과 동일해야 하며 파라미터는 다양하게 지정할 수 있다. 이렇게 만들어진 메소드는 이름이 같아도 파라미터가 다르므로 메소드 오버로딩(호출 시 파라미터 포함)이라는 방법으로 사용된다.

 

 

5. 클래스의 상속

 

슈퍼 클래스(부모 클래스)가 가지고 있는 모든 것(변수, 메소드)을 서브 클래스(자식 클래스)가 그대로 물려받아 사용하면서도 추가하여 사용할 수 있도록 정의한 것을 말한다. 마치 상속(extends)받은 서브 클래스에 슈퍼 클래스의 내용(변수, 메소드)이 있다고 생각하고 편안하게 사용하면 된다. 따라서 필드나 메소드에 대해 별도의 선언이나 정의하는 것 없이 사용이 가능하다. 슈퍼 클래스의 메소드를 서브 클래스에서 재 정의하여 사용하는 것을 메소드 오버라이딩(Overriding)이라고 한다.

 

■ Car.java

■ Automobile.java

 

  public class Automobile extends Car {

    int seatNum;

 

    int getSeatnum() {

      return seatNum;

    }

 

    void upSpeed(int value) {   //슈퍼 클래스인 Car 클래스에 upSpeed() 메소드가 있으므로 메소드 오버라이딩에 해당한다.

      if (speed +value >= 300)

        speed = 300;

      else

        speed = speed + (int) value;

    }

  } 

 

■ Example.java

 

  public class Example {

    public static void main(String args[]) {

      Automobile auto = new Automobile();   //Car를 상속받은 Automobile 클래스로부터 auto 객체를 생성함

 

      auto.upSpeed(250);   //메소드 오버라이딩이므로 Car 클래스가 아닌 Automobile 클래스의 upSpeed에 적용된다.

      System.out.println("승용차의 속도는  " + auto.getSpeed() + "km입니다.");   //getSpeed()메소드가 auto객체에 없음에 주목하라.

    }

  }

 

 

6. 추상 클래스, 추상 메소드

 

추상 클래스는 인스턴스를 만들지 못하도록 한 클래스다. 추상 클래스는 클래스 앞에 abstract 키워드만 적어주면 된다. 또한 추상 메소드는 메소드 안에 내용이 없은 메소드를 말하며 역시 메소드 앞에 abstract 키워드만 적어주면 된다. 추상 메소드를 포함하는 클래스의 경우 반드시 추상 클래스로 지정해야 한다. 추상 클래스와 추상 메소드를 사용하는 목적은 공통적으로 사용되는 기능을 추상 메소드로 만들어 놓은 후 추후에 추상 클래스를 상속(extends) 받은 후 추상 메소드를 오버라이딩해서 사용하기 위함이다. 이해가 되나?

 

 

7. 클래스 변수의 다형성

 

자신의 서브 클래스에서 생성한 인스턴스도 클래스 변수에 대입할 수 있다는 것으로 다형성을 이용하면 하나의 변수에 여러 종류의 인스턴스를 대입할 수 있다는 장점이 있다.

 

 

8. 인터페이스와 다중상속

 

인터페이스는 추상 클래스와 비슷한 성격(추상 메소드)으로 만들 때는 class 대신 interface 키워드를 사용해서 정의하며 이 interface를 사용할 때는 extends 키워드 뒤에 혹은 extends 대신 implements 키워드를 사용한다. interface내부에는 추상 메소드만 사용가능하며 abstract 키워드를 사용하지 않아도 있는 것으로 간주한다.

 

 

9. 익명 내부 클래스

 

익명 내부 클래스란 이름이 없는 내부 클래스를 의미한다. 한번 사용되고 버려지는 클래스로 버튼을 클릭했을 때 발생하는 이벤트의 인터페이스 리스터(Listener)를 생성할 때 주로 사용된다. 어렵다. 다음에 다시 이해해 보겠다.

bottom of page