자바의 메소드와 메소드 오버로딩에 대해서 알아볼께.

메소드

자바의 메소드는 객체가 할 수 있는 행동을 정의해. 자바 프로그래밍에서는 일반적으로 메소드의 이름을 소문자로 시작하는 것이 관례야.

[접근제한자] [static/final/abstract/synchronized] 반환값 메소드 이름([매개변수들]) {
	... //지역변수 선언 및 메소드 행위 기술
}

자바는 메소드에도 접근 제한자를 붙일 수 있는데 멤버 변수와 같이 public, private, protected를 사용해서 접근을 제한할 수 있어.

아래는 자바 메소드를 구현한 샘플 코드들이야.

class Fruit {
	int apple;
	int straw;
	int grapes;
	int sum;

	Fruit(int apple, int straw, int grapes) {
		this.apple = apple;
		this.straw = straw;
		this.grapes = grapes;
	}
	public int count() {
		sum = apple + straw + grapes;
		return sum;
	}
}

class MethodDemo1 {
	public static void main(String args[]) {
		int total;
		Fruit f1 = new Fruit(30, 30, 30);
		total = f1.count();
		System.out.println("객체  f1의 총 개수 = " + total);
		//사과의 개수를 읽어 오기 위해 객체 속성 변수에 접근
		//객체 속성 변수의 값을 직접 변경(f1.apple = 90)을 할 수 있어 정보의 변조가 가능하게 됨
		System.out.println("객체  f1의 apple 개수 = " + f1.apple);
		System.out.println("객체  f1의 straw 개수 = " + f1.straw);
		System.out.println("객체  f1의 grapes 개수 = " + f1.grapes);
	}
}
//캡슐화의 예
class Fruit {
	private int a;
	private int s;
	private int g;
	private int sum;

	Fruit(int apple, int straw, int grapes) {
		a = apple;
		s = straw;
		g = grapes;
		this.count();
	}
	private void count() {
		sum = a + s + g;
	}
	public int gettotal() {
		//모든 과일의 합은 이 메소드를 통해서만 접근
		return sum;
	}
	public int getapple() {
		//a 값에 대해 읽기만 허용하기 위한 메소드
		return a;
	}
	public int getstraw() {
		return s;
	}
	public int getgrapes() {
		return g;
	}
}

class MethodDemo2 {
	public static void main(String args[]) {
		int total;
		Fruit f1 = new Fruit(30, 30, 30);
		total = f1.gettotal(); //f1.count()를 사용하면 에러 발생
		System.out.println("객체  f1의 총 개수 = " + total);
		//메소드를 이용하여 사과의 개수를 읽어오는 것만 가능
		//만일 사용자가 "f1.a = 50"과 같은 문장으로 객체 속성 변수에 직접 접근하면 에러 발생
		System.out.println("객체  f1의 apple 개수 = " + f1.getapple());
		System.out.println("객체  f1의 straw 개수 = " + f1.getstraw());
		System.out.println("객체  f1의 grapes 개수 = " + f1.getgrapes());
	}
}

클래스 메소드: static

자바는 static을 붙여 클래스 메소드 선언할 수 있는데 클래스 변수와 같이 클래스명을 통해 접근할 수 있어. 클래스 메소드를 선언한 경우 클래스 메소드 내에서는 클래스 변수만을 사용할 수 있어.

아래의 예제는 클래스 메소드의 간단한 예제들이야.

class Box {
	int width;
	int height;
	int depth;
	long idNum;
	static long boxID = 100;
	//클래스 메소드는 클래스 변수만 사용
	static long getcurrentID() {
		return boxID++;
	}
}

class StaticMethodDemo {
	public static void main(String args[]) {
		Box mybox1 = new Box();
		mybox1.idNum = Box.getcurrentID();
		Box mybox2 = new Box();
		mybox2.idNum = Box.getcurrentID();
		System.out.println("mybox1의 id 번호 : " + mybox1.idNum);
		System.out.println("mybox2의 id 번호 : " + mybox2.idNum);
		System.out.println("다음 박스의 번호는 " + Box.boxID + "번 입니다.");;
	}
}
class One {
	int value;
	public One() {
		this(100);
	}
	public One(int value) {
		this.value = value;
		Another.methodA(this);
	}
}

class Another {
	static void methodA(One ins) {
		System.out.println("메소드A에서의 값 : " + ins.value);
	}
}

class OneTest {
	public static void main(String args[]) {
		One t1 = new One();
		System.out.println("기본값 : " + t1.value);
		int value = Integer.parseInt(args[0]);
		Ont t2 = new One(value);
		System.out.println("사용자가 입력한 값 : " + t2.value) ;
	}
}

final, abstract, synchronized 메소드

자바에서는 메소드를 final, abstract, synchronized로 선언할 수 있는데 각 선언의 의미는 아래와 같아.

  • final: final로 선언된 메소드는 하위 클래스에서 치환(overriding) 될 수 없음
  • abstract: 추상 메소드로서 추상 클래스내에 선언될 수 있음
  • synchronized : 스레드 동기화를 위한 메소드

메소드 접근

자바는 일반 메소드와 클래스 메소드에 접근할 수 있는데 각각의 접근 방법은 아래와 같아.

클래스 메소드 접근 형식

클래스이름.클래스메소드이름(매개변수)

일반 메소드 접근 형식

객체이름.객체메소드이름(매개변수)

메소드 반환값

자바에서 메소드는 선언부에 반환값이 지정되어야 해. 만약 반환값이 없으면 void로 지정하면 돼. 그리고 데이터는 기본 자료형 뿐만아니라 참조 자료형의 데이터도 반환 받을 수 있어.

반환값을 지정하는 방법은 아래와 같아.

//기본 자료형 데이터를 반환하는 메소드는 메소드 선언부에 지정된 반환 타입과
//실제 반환하는 데이터 타입이 일치해야 함
public int sum(int a, int b) {
	int c;
	c = a + b;
	return c;
}

아래는 참조 자료형 객체를 반환받는 메소드를 구현한 예제야.

//참조 자료형인 객체를 반환하는 메소드
public Box volume_compute(Box instance_box) {
	Box v_box = new Box();
	v_box.width = instance_box.width;
	v_box.height = instance_box.height;
	v_box.depth = instance_box.depth;
	v_box.volume = v_box.width * v_box.height * v_box.depth;
	return v_box;
}

메소드 오버로딩(Overloading)

메소드 오버로딩은 생성자의 오버로딩과 같은 개념이야. 즉 한 클래스 내에서 같은 이름의 메소드를 사용할 수 있는 건데 같은 이름의 메소드는 매개변수의 타입과 갯수가 달라야 해.

메소드 오버로딩은 자바의 특징인 하나의 인터페이스를 사용하여 다양한 구현 방법을 제공하는 다형성(polymorphism)을 구현하는 방식인거지.

아래는 메소드 오버로딩을 구현한 예제들이야.

class Overload1 {
	void test() {
		System.out.println("매개변수 없음");
	}

	void test(int a) {
		System.out.println("매개변수 int" + a);
	}

	void test(int a, int b) {
		System.out.println("매개변수 int " + a + "와 int " + b);
	}

	void test(double a) {
		System.out.println("매개변수 double " + a);
		return a * 2;
	}
}

class OverLoadDemo1 {
	public static void main(String args[]) {
		Overload1 ob = new Overload1();
		double result;

		ob.test();
		ob.test(100);
		ob.test(5, 10);
		result = ob.test(4.2);
		System.out.println("ob.test(4.2)의 결과 : " + result);
	}
}
class Overload2 {
	void test() {
		System.out.println("매개변수 없음");
	}

	void test(int a, int b) {
		System.out.println("매개변수 int " + a + "와 int " + b);
	}

	void test(double a) {
		System.out.println("매개변수 double " + a);
		return a * 2;
	}
}

class OverLoadDemo1 {
	public static void main(String args[]) {
		Overload2 ob = new Overload2();
		int i = 88;

		ob.test();
		ob.test(10, 20);
		ob.test(i); //자동형변환을 거쳐  void test(double a)를 실행
		ob.test(123.2);
	}
}
class Overload {
	void calc() {
		System.out.println("매개 변수가 없습니다.");
	}

	void calc(int width) {
		system.out.println("정사각형의 넓이" + width * width);
	}

	void calc(int width, int height) {
		system.out.println("직사각형의 넓이" + width * height);
	}

	void calc(int width, int height, int depth) {
		system.out.println("직육면체의 부피" + width * height + depth);
	}
}

class OverloadDemo3 {
	public static void main(String args[]) {
		Overload ol = new Overload();
		int input[] = new int[args.length];
		for(int i=0; i<args.length; i++) {
			input[i] = Integer.parseInt(args[i]);
		}
		switch(args.length) {
			case 0:
				ol.calc();
				break;
			case 1:
				ol.calc(input[0]);
				break;
			case 2:
				ol.calc(input[0], input[1]);
				break;
			case 3:
				ol.calc(input[0], input[1], input[2]);
				break;
			default:
				System.out.println("인수의 개수가 많습니다.");
		}
	}
}

Share This Post

Leave a Reply

Your email address will not be published. Required fields are marked *

Latest Post

  • Criss Cross Crossover Crunch Flutter Kicks Heel Touch Knees Up Crunch Legs Lower Plank Side Plank Superman Arms Up Crunch Aquaman Catch Dish Oblique Crunch
  • Businesses can survive by constantly generating revenue by selling goods or services. Companies that do not have sales or profit can not survive. So it
  • Amazon CEO Jeff Bezos sends letters to shareholders every year. This letter contains Amazon’s current achievements and future vision. He also enclose that the first
  • A middle-aged man came to Pastor Norman Vincent Peale one day to ask him for counseling. The dejected man told Pastor Norman Vincent Peale. “Pastor,
  • I have been working as an IT freelancer for over 10 years and have had a chance to work with various clients. Working freelance, I
  • CNBC analyzed the minutes of the Berkshire Hathaway shareholders’ meeting to find out why Warren Buffett could be an excellent investor. It is already known,
  • Good timing is like a good choice. So what is ‘good choice’? A good choice is to decide what you need to do first. That
  • We learned that in childhood we should brush our teeth immediately after eating rice. However, this is a common misconception in the days when common
  • In most cases, it is important for novice marketers to work efficiently by reducing the waste of work and increasing focus. He will not used
  • source: vornado.com The circulator is the abbreviated name for ‘air circulator’. The air circulator actually has a different purpose than the fan. Unlike a fan