메소드는 이전에 객체에서 동작을 담당하는 구역이라고 말한 바 있다. 메소드는 크게 리턴 타입, 이름, 매개 변수, 중괄호로 이루어져 있다. 객체를 생성한 후 실행 클래스에서 해당 객체의 메소드를 실행하게 되면 그 이름에 맞는 메소드는 중괄호 내의 모든 코드를 실행한다. 메소드는 주로 객체 내의 데이터 값을 수정하고 필드를 초기화하는 등의 역할을 하지만 또 다른 객체를 생성하기도 하고 객체 간의 데이터를 주고받기도 하는 등의 다양한 동작을 행한다.

 

 그럼 메소드 선언부 중 리턴 타입에 대해 알아보겠다. 리턴 타입은 말 그대로 메소드가 실행되고 리턴되는 데이터의 타입을 의미한다. 만약 int형으로 반환하겠다 하면 int형으로 선언하면 되고 String형은 String으로 선언하면 된다. 이때 메소드를 void로 선언하게 될 경우 리턴 값이 없다는 것을 의미한다. 메소드에서는 리턴되는 값이 있냐 없냐에 따라 실행 클래스에서 메소드를 실행하는 방식도 달라지게 된다.

public void printString(){
	System.out.println("12345");
}

public int returnNumber(){
	return 1;
}

 위처럼 2개의 메소드가 있다고 가정했을 때 위의 printString메소드는 단순히 '12345'를 출력하고 종료된다. 하지만 아래의 returnNumber메소드는 1을 반환하므로 이 1이 저장될 변수가 필요하다. 때문에 실행시에는 아래와 같이 해야한다.

printString();
int number=returnNumber();

 이때 주의할 점은 Return_number메소드의 리턴 타입과 결괏값을 저장할 변수의 자료형이 같아야 한다는 것이다. 만약 다를 경우에는 자료형을 맞춰서 저장해주어야 오류가 발생하지 않는다.

 

 다음으로 메소드 선언부 중에서 메소드 이름 부분에 대해 알아보겠다. 이 부분은 크게 볼 것이 없어서 간단히 넘어가겠다. 아래는 메소드 이름을 지을 때 주의해야 할 몇가지 규칙이다.

 

 - 숫자로 시작할 수 없고, $,_를 제외한 특수문자를 사용할 수 없다.

 - 관례적으로 메소드 이름은 소문자로 작성한다.

 - 서로 다른 단어가 이어진 메소드 이름일 경우 뒤의 오는 단어의 첫글자는 대문자로 작성한다.

 

 마지막으로 매개 변수 부분에 대해서 알아보도록 하겠다. 매개 변수가 존재하는 이유는 메소드를 실행할 때 메소드 내에서 필요한 데이터를 외부로부터 전달받기 위해 존재한다.

public int plusValue(int a, int b){
	return a+b;
}

 위의 메소드는 간단하게 매개 변수로 들어온 a와 b를 더해서 반환하는 구조로 되어있다. 이를 실행하기 위해서는 매개 변수 값으로 2개의 값을 전달해야 하지만 만약 1개만 전달하거나 전달하지 않을 경우 오류가 발생하게 된다. 또 int값이 아닌 다른 값(float이나 double)과 같은 값을 넘겨주게 되면 오류가 발생한다.

 

 그러면 전체적으로 클래스 내부에서의 구조와 이를 실행하려면 어떤 식으로 해야하는지 알아보겠다.

public class Person {
	String name;
    int age;
    int height;
    
    Person(String name, int age, int height){
    	this.name=name;
        this.age=age;
        this.height=height;
    }
    
    public String returnName(){			// 이름을 반환하는 메소드
    	return name;
    }
    
    public void modifyAge(int age){		// 나이를 수정하는 메소드
    	this.age=age;
    }
}

 위의 코드는 클래스이고 아래의 코드는 실행 클래스에서의 객체 생성과 메소드 실행 방법이다.

Person p1=new Person("Kim", 22, 180);
String name=p1.returnName();
p1.modifyAge(20);

 위의 코드처럼 실행하게 되면 처음에 설정한 name을 반환받게 되고 age 필드는 처음에 22로 설정되었다가 후에 20으로 수정된다.

'프로그래밍 > JAVA' 카테고리의 다른 글

return문  (0) 2021.04.30
생성자 오버로딩(Overloading)  (0) 2021.04.30
this  (0) 2021.04.30
생성자  (0) 2021.04.30
클래스의 구성 요소  (0) 2021.04.29

 지난 포스팅에서 클래스를 생성하는 방법에 대해서 알아보았다. 클래스를 선언하고 컴파일을 완료했다면 이는 공장에서 설계도가 준비되어 생산준비에 들어간 것과 같다고 할 수 있다. 이제 이 클래스를 사용하기만 하면 되는데 이때 new연산자를 통해 클래스를 인스턴스화(클래스를 통해 객체를 생성하는 것을 '인스턴스화'라고 한다) 하게 된다.

Person me=new Person();

 만약 Person이라는 클래스가 있다면 위와 같이 생성할 수 있다. 이때 사용한 것이 new 연산자이고 뒤의 Person(); 부분이 Person클래스를 ()를 통해 생성자를 호출한다는 뜻이라고 할 수 있다.

 

 new 연산자를 통해서 객체를 생성하게 되면 객체는 메모리 힙(heap) 영역에 생성되게 된다. new 연산자는 이 영역에 객체를 생성한 후에 객체의 주소를 리턴한다.

 

 클래스는 크게 2가지 용도로 나눌 수 있다. 하나는 라이브러리(API : Application Program Interface)용도이고 다른 하나는 실행용이다. 라이브러리는 말 그대로 도서관처럼 필요한 것을 가져다가 실행용 클래스에서 사용하는 목적으로 생성되는 클래스를 말한다. 이때 실행용 클래스는 단 하나밖에 존재하지 않아서 클래스가 무수히 많더라도 실행클래스는 1개라고 할 수 있다. 우리가 프로그램을 실행할 때 main함수가 들어있는 클래스가 실행용 클래스이다.

'프로그래밍 > JAVA' 카테고리의 다른 글

생성자  (0) 2021.04.30
클래스의 구성 요소  (0) 2021.04.29
클래스 선언  (0) 2021.04.29
Class - Field  (0) 2021.03.16
객체 지향 프로그래밍  (0) 2021.03.16

 지난 포스팅에서 클래스란 설계도면과 같다고 얘기했다. 그렇다면 이제 이 클래스를 어떻게 만들고 써먹는지에 대해 알아보도록 하겠다. 정말 간단하게 생성할 수 있지만 몇가지 규칙이 있다.

 

 - 하나 이상의 문자로 이루어져야 함

 - 첫 글자는 숫자 불가능

 - '$','_' 외의 특수 문자는 사용 불가능

 - 자바에서 지정한 키워드는 사용 불가능 (예: int, for 등등)

 

 위 규칙만 지킨다면 생성에 문제가 될 것은 없다. 하지만 보통 클래스 이름을 지을 때 첫글자는 대문자로 작성하는 것이 관례이다. 이름을 지었다면 클래스 파일을 생성해야 한다. 이때 소스 파일의 이름은 클래스 이름과 반드시 동일해야 한다. 만약 한 자라도 틀린다면 오류가 발생하게 된다. 소스 파일의 이름은 "클래스이름.java"와 같이 생성한다. 소스 파일을 생성했다면 열고 다음과 같이 선언을 해주어야 한다.

 

public class 클래스이름 {

}

 위 예시에서 앞에 public 접근 제한자를 붙여 주었는데 이때 다른 제한자를 사용하게 되면 오류가 발생하게 된다.

보통은 하나의 소스 파일에 하나의 클래스를 선언하지만 2개 이상의 클래스를 선언해도 무관하다. 하지만 여기서 접근제한자 public 을 2개의 클래스 모두에 붙여주게 되면 또 오류가 발생하게 된다. public은 소스 파일의 이름과 같은 클래스에만 사용할 수 있다.

 

 위처럼 클래스 파일을 작성한 후 컴파일을 하게 되면 .class 파일이 생성이 되는데 이는 소스 파일의 개수와 상관없이 내부에 선언된 클래스의 개수만큼 생성이 된다.

'프로그래밍 > JAVA' 카테고리의 다른 글

클래스의 구성 요소  (0) 2021.04.29
객체 생성 & 클래스 변수  (0) 2021.04.29
Class - Field  (0) 2021.03.16
객체 지향 프로그래밍  (0) 2021.03.16
자바 배열  (0) 2019.04.25

 필드 선언

 이번에는 클래스의 구성요소 중 필드에 대해서 알아보도록 하겠습니다. 필드란 쉽게 말해서 객체의 속성을 정의하는 공간이라고 할 수 있습니다. 예를 들어 휴대폰을 객체로 가정한다면 고유한 값을 가지는 제조사, 크기, 모델이름 등등이 고유 데이터에 해당하고 배터리 상태, 통신사 등등은 상태 데이터에 해당한다고 할 수 있습니다. 그리고 휴대폰에 블루투스로 이어폰, 워치 등등이 추가된다면 이는 휴대폰과 다른 객체이므로 다른 클래스가 선언 되어야 합니다. 위의 속성들을 클래스에 필드로 선언한다면 아래와 같이 될 수 있습니다.

public class Phone {
	String maker;
    int display_size;
    String model_number;
    
    int battery;
    String carrier;
    
    Earphone earphone;
    Watch watch;
}

 필드를 선언하는 위치는 어디가 되든 상관없습니다. 하지만 생성자와 메소드 중괄호 내부의 블록에는 선언될 수 없습니다. 만약 이들 중 한곳에 선언했다면 그것은 필드가 아닌 로컬 변수가 돼버립니다. 필드 선언 방법은 변수의 선언 방법과 같다고 볼 수 있습니다. 만약 초기값이 주어지지 않으면 객체 생성 시에 자동으로 초기화가 진행됩니다.

 

 필드 사용

 필드를 사용한다는 것은 필드값을 읽고, 변경하는 행위를 말합니다. 클래스 내부에서 생성자나 메소드가 필드를 사용할 경우 변수를 사용하듯이 사용하면 되지만 클래스 외부에서 사용할 경우에는 우선 해당 클래스로부터 객체를 생성한 뒤 필드에 접근해야 합니다. 그 이유는 해당 객체가 존재하지 않으면 필드 또한 존재하지 않기 때문입니다.

 

 클래스 외부에서 해당 객체의 필드에 접근하려고 할 때에는 도트(.)를 이용해서 접근할 수 있습니다. 아래의 예시에서 살펴보도록 하겠습니다.

 

-Person 클래스

void method(){
	Phone myPhone=new Phone();
    myPhone.battery=75;
}

-Phone 클래스

int battery;

Phone(){
	battery=0;
}

void method(){
	battery=50;
}

 위의 예시에서는 클래스 내부에서는 변수처럼 사용할 수 있지만 클래스의 외부에서는 도트(.) 연산자를 통해 접근하는 것을 확인할 수 있습니다.

'프로그래밍 > JAVA' 카테고리의 다른 글

객체 생성 & 클래스 변수  (0) 2021.04.29
클래스 선언  (0) 2021.04.29
객체 지향 프로그래밍  (0) 2021.03.16
자바 배열  (0) 2019.04.25
자바 메서드 - 문제  (0) 2019.04.22

1. 배열

 배열이라는 것은 동일한 자료형으로 선언된 변수들을 묶는 것이라 할 수 있습니다. 이는 변수를 하나씩 생성하는 것에 비해 관리가 매우 수월합니다. 만약 성적을 입력받는 프로그램을 만들고자 한다면 int형의 변수를 여러개를 생성하여 변수의 개수만큼 입력문을 받아야 할 것입니다. 하지만 배열을 사용한다면 하나의 반복문만으로도 모든 변수에 값을 저장할 수 있을 것입니다. 아래의 예시를 보도록 하겠습니다.

 

 - int kor=0;

   int eng=0;

   int mat=0;

 

   System.out.print("국어 : ");

   kor=sc.nextInt();

   System.out.print("영어 : ");

   eng=sc.nextInt();

   System.out.print("수학 : ");

   mat=sc.nextInt();

 

 이처럼 같은 구조를 반복해야 하는 메모리의 비효율성과 번거로움을 갖게 됩니다. 하지만 이를 배열로 해결한다면 아래와 같이 해결할 수 있습니다.

 

 - int[] sub=new int[3];

   String[] subject={"국어", "영어", "수학"};

   

   for(int i=0; i<subject.length; i++){
      System.out.println(subject[i]+" : ");

      sub[i]=sc.nextInt();

   }

 

 배열을 사용하면 훨씬 간단하고 효율적으로 코드를 작성할 수 있습니다. 

 

2. 일차원 배열

 배열에는 일차원 배열을 포함한 다차원 배열이 있습니다. 그 중 일차원 배열에 대해 알아보도록 하겠습니다. 다차원 배열이라고 해서 일차원 배열과 크게 다른 것이 없습니다. 단순히 []하나만 더 붙으면 차수가 올라갑니다. 우선 일차원 배열의 선언 방법부터 알아보도록 하겠습니다. 

 

 - 자료형[] 배열명;

   자료형 배열명[];

 

 위의 방식처럼 2가지의 방법으로 나타낼 수 있습니다. 이때 배열의 자료형으로는 기본 자료형을 비롯하여 String과 System같은 클래스 자료형도 가능합니다. 이후에 오는 배열명은 4byte의 레퍼런스형으로서 어딘가의 주소를 저장할 수 있는 자료형입니다. 그렇다면 배열의 초기화 방법에 대해 알아보도록 하겠습니다. 

 

 - 자료형[] 배열명 = {값1, 값2, 값3 ,,, 값n };  // 선언과 동시에 이루어져야 함

   배열명 = new 자료형[개수];   // 선언과 별개로 초기화 가능

   배열명 = new 자료형[]{값1, 값2, 값3 ,,, 값n };   // 선언과 별개로 초기화 가능

 

 초기화하는 방법에 대해 알아보았으므로 이제 사용하는 방법에 대해 알아보겠습니다. 우선 배열의 구조는 '배열명[인덱스]'와 같습니다. 이 인덱스는 숫자로 이루어져있으며 0부터 시작합니다. 예를 들어 int A[10];이라고 배열을 선언했다면 A배열은 0~9까지의 인덱스를 갖게 됩니다. 아래의 예시를 보도록 하겠습니다.

 

 - char[] ch = {'A', 'B', 'C'};

   System.out.println(ch[0]);

   System.out.println(ch[1]);

   System.out.println(ch[2]);

 

 위의 예시를 보면 선언과 동시에 초기화가 이루어진 것으로 실행해보면 각 글자가 한 줄 단위로 띄어져서 출력되는 것을 알 수 있습니다. 

 

 매번 코드를 작성할때 기본 양식에 main함수 부분을 보면 'public static void main(String[] args)'이라는 문구가 있는 것을 볼 수 있습니다. 이때 'String[] args'라는 부분은 각 프로그램마다 필요로 하는 것들을 매개변수를 통해 전달해주는 역할을 합니다. 이를 응용하여 아래의 코드를 살펴보도록 하겠습니다. 

public class Round08_Ex01 {

	public static void main(String[] args) {
		
		System.out.println("ar[0] = "+args[0]);
		System.out.println("ar[1] = "+args[1]);
		System.out.println("ar[2] = "+args[2]);

	}

}

 만약 이러한 코드가 있다고 가정할 때 컴파일 시에는 아무런 문제가 발생하지 않지만 실행해보면 문제가 발생하는 것을 확인할 수 있습니다. 이유는 실행 시에 기본 매개변수에 아무런 값도 넣어주지 않았기 떄문에 에러가 생기는 것입니다. 이를 해석해보면 선언만 하고 아무런 초기화 과정도 거치지 않았기 때문에 에러가 발생하는 것입니다. 그렇다면 프로그램을 실행하면서 매개변수로 임의의 글자를 넣어보도록 하겠습니다.

 이렇게 코드 내에서 초기화를 하지 않아도 매개변수를 통해 원하고자 하는 값을 출력이 가능하다는 것을 알 수 있습니다. 그렇다면 이클립스 프로그램에서 코드를 실행할 때에는 어떻게 매개변수를 전달하는지에 대해 알아보도록 하겠습니다. 우선 Run탭의 'Run Configurations' 항목을 들어가줍니다. 이후 중간부분의 'Arguments' 탭을 눌러줍니다.

 그런 후에 'Program arguments'부분에 전하고자 하는 값을 넣어준 후 'Run'을 눌러주면 아까와 같은 결과값이 나오는 것을 확인할 수 있습니다.

 

 그렇다면 이제 지금까지 배운 모든 것을 통합해서 성적을 출력하는 프로그램을 작성해보도록 하겠습니다.

import java.util.Scanner;

public class Round08_Ex04_2 {

	public static void main(String[] args) {
		
		Scanner sc=new Scanner(System.in);
		String[] subname= {"국어", "영어", "수학"};
		int[] sub=new int[subname.length+1];  // 기존의 3개 과목에 총점도 추가해야하므로 +1
		float ave=0.0f;
		
		for(int i=0; i<sub.length-1; i++) {  // i는 0으로 초기화하고 sub변수의 길이까지 반복
			do {
				System.out.println(subname[i]+" : ");
				sub[i]=Integer.parseInt(sc.nextLine());
			} while(sub[i]<0||sub[i]>100);  // 입력 값이 0보다 작고 100보다 크면 다시 입력
			sub[sub.length-1]+=sub[i];  // sub배열의 마지막 인덱스에 총합 저장
		}
		
		ave=sub[sub.length-1]/(float)(sub.length-1);  // 총합 나누기 과목 수
		
		System.out.println();
		System.out.println("총점 : "+sub[sub.length-1]);
		System.out.println("평균 : "+ave);

	}

}

  위의 코드에서 sub.length와 같이 붙어있는 .length라는 것은 해당 배열이나 멤버의 크기(길이)를 나타냅니다. 이렇게 배열을 이용하면 복잡하고 번거로운 작업을 쉽고 효율적으로 처리할 수 있습니다.

 

3. 다차원 배열

 다차원 배열의 개념은 쉽게 말해 일차원 배열이 2개가 묶여있는 것이라고 보면 됩니다. 예를 들어 일차원 배열이 일직선의 길이라고 표현한다면 2차원 배열은 직선 2개가 모인 넓이, 3차원 배열은 넓이에 직선이 추가된 공간과 같은 개념으로 볼 수 있습니다. 다차원 배열도 일차원 배열과 선언, 사용하는 방법에 있어 같기 때문에 어려울 것은 없습니다.

 

 - 자료형[][] 배열명;

   자료형[] 배열명[];

   자료형 배열명[][];

 

 일차원 배열에 비해서 대괄호( [] ) 하나가 더 생겨난 것입니다. 그렇다면 초기화 하는 방법에 대해 알아보도록 하겠습니다.

 

 - 자료형[][] 배열명={{값1, 값2, 값3 ,,, 값n}, {값a, 값b, 값c ,,, 값n}};

   배열명 = new 자료형[][]{{값1, 값2, 값3 ,,, 값n}, {값a, 값b, 값c ,,, 값n}};

   배열명 = new 자료형[개수][개수];

   배열명 = new 자료형[개수][];

 

 일차원 배열과 다른 점이라면 초기화를 할 때 중괄호( {} )를 2개 사용한다는 것입니다. 이러한 다차원 배열의 값을 나타내는 방식 또한 일차원 배열과 같이 '배열명[인덱스][인덱스]'를 통해 나타냅니다. 그렇다면 다차원 배열의 예시로 아래의 코드를 살펴보도록 하겠습니다. 이 코드는 세 학생의 점수를 입력받아 각 총점과 평균을 나타내는 코드입니다.

import java.util.Scanner;

public class Round08_Ex06 {

	public static void main(String[] args) {
		
		Scanner sc=new Scanner(System.in);
		String[] subject= {"국어", "영어", "수학"};  // 입력받을 과목 3개
		int[][] sub = new int[3][subject.length+1];  // 과목3개 + 총합
		float[] ave = new float[3];
		
		for(int k=0; k<sub.length; k++) {  // 과목+총합 배열의 수만큼 반복
			for(int i=0; i<sub[k].length-1; i++) {  // 각 학생의 과목 배열 수만큼 반복
				do {
					System.out.print(subject[i]+" : ");
					sub[k][i]=sc.nextInt();
				} while(sub[k][i]<0||sub[k][i]>100);  // 입력값이 0보다 작거나 100보다 크면 다시
				sub[k][sub[k].length-1]+=sub[k][i];  // 총점은 각 과목의 합
			}
			ave[k]=sub[k][sub[k].length-1]/(float)(sub[k].length-1);
		}
		
		for(int k=0; k<sub.length; k++) {
			System.out.println();
			System.out.println("총점 : "+sub[k][sub[k].length-1]);
			System.out.println("평균 : "+ave[k]);
			
		}
	}
}

 위 코드의 실행화면은 아래와 같습니다.

 이상으로 배열에 대해 알아보았습니다.

'프로그래밍 > JAVA' 카테고리의 다른 글

Class - Field  (0) 2021.03.16
객체 지향 프로그래밍  (0) 2021.03.16
자바 메서드 - 문제  (0) 2019.04.22
자바 메서드 ( method )  (0) 2019.04.21
자바 제어문 - 문제  (0) 2019.04.19

1. 계산기 프로그램을 작성하되 각 연산자의 연산은 메서드를 통해서 작성

 

 - 코드

import java.util.Scanner;

public class Test01 {
	
	public static int plus(int num, int num2) {  // 더하기 메서드
		int tot = num + num2;
		return tot;
	}
	
	public static int minus(int num, int num2) {  // 빼기 메서드
		int tot = num - num2;
		return tot;
	}
	
	public static int multiply(int num, int num2) {  // 곱하기 메서드
		int tot = num * num2;
		return tot;
	}
	
	public static int division(int num, int num2) {  // / 연산 메서드
		int tot = num / num2;
		return tot;
	}
	
	public static int division2(int num, int num2) {  // % 연산 메서드
		int tot = num % num2;
		return tot;
	}

	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		System.out.print("su1 : ");   // 첫 번째 수를 입력받아 저장
		int first = sc.nextInt();
		System.out.print("yon<+, -, *, /, %> : ");
		String yon = sc.nextLine();   // 연산자를 입력받아 저장
		System.out.print("su2 : ");
		int second = sc.nextInt();   // 두 번째 수를 입력받아 저장
		
		if(yon.equals("+"))  // 연산자가 +일 경우 더하기 메서드 실행
			System.out.println(first+" "+yon+" "+second+" = "+plus(first, second));
		else if(yon.equals("-"))  // 연산자가 -일 경우
			System.out.println(first+" "+yon+" "+second+" = "+minus(first, second));
		else if(yon.equals("*"))  // 연산자가 *일 경우
			System.out.println(first+" "+yon+" "+second+" = "+multiply(first, second));
		else if(yon.equals("/"))  // 연산자가 /일 경우
			System.out.println(first+" "+yon+" "+second+" = "+division(first, second));
		else if(yon.equals("%"))  // 연산자가 %일 경우
			System.out.println(first+" "+yon+" "+second+" = "+division2(first, second));

	}

}

 

2. 문자열을 입력받는 범용 메서드를 작성

 

 - 코드

import java.util.Scanner;

public class Test02 {
	
	public static String input() {
		
		String str;
		Scanner sc = new Scanner(System.in);
		return str = sc.nextLine();
		
	}

	public static void main(String[] args) {
		
		String name="";
		System.out.print("이름을 입력하세요 : ");
		name = input();   // 이름을 입력받을 때 input()메서드 실행
		
		System.out.println(name+"님, 안녕하세요");
		
	}

}

 

3. 특정 수를 입력받는 범용 메서드를 작성

 

 - 코드 

import java.util.Scanner;

public class Test03 {
	
	public static int function(String str) {
		
		Scanner sc = new Scanner(System.in);
		System.out.println(str + " : ");
		int tmp = sc.nextInt();
		return tmp;
		
	}

	public static void main(String[] args) {
		
		int num = function("국어");  // function()메서드에 매개변수로 '국어' 전달
		System.out.println("국어 점수는 : "+num+"입니다");

	}

}

 

'프로그래밍 > JAVA' 카테고리의 다른 글

객체 지향 프로그래밍  (0) 2021.03.16
자바 배열  (0) 2019.04.25
자바 메서드 ( method )  (0) 2019.04.21
자바 제어문 - 문제  (0) 2019.04.19
제어문 - 2 ( for, while, do-while )  (0) 2019.04.17

1. 메서드의 정의 & 용법

 현재까지 자바를 공부하면서 다른 언어들과는 다른 규칙들이 있는 것을 알 수 있었습니다. 모든 코드는 클래스라는 파일 안에 작성되고 실질적으로 이루어지는 내용은 main함수 안에 작성해야 이뤄지는 것을 알 수 있었습니다. 메서드란 쉽게 말해서 C언어에서 함수라고 불리는 부분을 메서드라고 부를 수 있습니다. 하지만 C언어에서와 마찬가지로 한 메서드 안에 많은 양의 코드를 작성하는 것은 비효율적이고 복잡하기 때문에 이를 단순화하기 main메서드 외의 다른 메서드를 만들어 사용합니다. 우선 메서드의 형태를 알아보도록 하겠습니다.

 

 - 접근_제한자 [ 지정 예약어 ] 반환형 메서드명( 매개_변수 ) [ throws 예외_클래스들 ]

   {

     내용;

   }

 

 위의 메서드 형식을 자세하게 알 필요는 없습니다. 물론 다양한 요소들이 바뀔 수 있지만 이는 추후에 여러 예제를 보고 더 공부하게 되면 자연스레 알게 되는 것이므로 아래의 형식만을 살펴보도록 하겠습니다.

 

 - public static 반환형 메서드명 ( 매개_변수들 ) [ throws 예외_클래스들 ] 

   { 

     내용;

   }

 

 앞서 보았던 형식과는 크게 다른 것은 없지만 접근 제한자를 public 으로 사용하고 지정 예약어를 static으로 고정한다는 것이 약간 다릅니다. 여기서 알고 넘어가야 할 것은 static 메서드는 static 메서드에서만 사용이 가능하다는 것입니다. 이는 main메서드는 static으로 선언되어 있으므로 main메서드에서 다른 메서드를 호출하여 사용하려면 어쩔 수 없이 static으로 선언되어야 합니다.

 

 1] 반환형

  반환형이란 메서드가 내용을 실행하고 되돌려주는 값을 의미합니다. 때문에 main메서드나 다른 메서드에서 해당 메서드를 호출했다면 내용을 실행하고 다시 자신을 호출했던 메서드에게 결과값을 돌려주어야 합니다. 이때 반환형에는 void를 포함한 여러 자료형이 올 수 있지만 void를 사용했다면 아무것도 돌려주지 않아도 된다는 의미이고, 자료형으로 선언했다면 결과값을 각 자료형에 맞게 반환해주면 됩니다.

 

 2] 메서드명

  메서드명이라는 것은 일련의 이름이기 때문에 main메서드를 제외한 메서드의 이름은 사용자가 임의로 지정할 수 있습니다. 

 

 3] 매개 변수

  매개 변수라는 것은 메서드가 실행될 때 안의 내용을 수행하기 위해 필요로 하는 값을 호출과 동시에 넘겨주는 것입니다. 이는 사용자가 메서드를 어떻게 작성하느냐에 따라 필요할 수도, 필요하지 않을 수도 있습니다.

 

 4] 에외 클래스

  앞서 입력과 출력을 처리할 때에는 '예외처리'라는 것을 해주어야 한다는 것을 배웠습니다. 이는 main메서드에서만 해당되는 것이 아니기 때문에 다른 메서드에서도 필요시 입력해주어야 합니다.

 

 이제 예제를 통해 실질적으로 어떻게 사용되는지에 대해 알아보도록 하겠습니다.

public class Round07_Ex01 {

	public static void x() {
		for(int i=0; i<5; i++) 
			System.out.print("*");
		return;   // 반환형이 void인 경우에는 생략 가능
	}
	
	public static void main(String[] args) {
		
		x();
		System.out.println("\nHello");
		x();
		System.out.println("\nJava");
		x();
		System.out.println("\n!");
		x();
		return;   // main메소드에도 원래는 이 구문이 있어야 하지만 자동 생략
	
	}

}

 위의 코드의 결과를 살펴보면 아래와 같습니다.

 위처럼 메서드를 사용했을 때의 결과를 알 수 있습니다. 만약 이러한 결과가 나오기 위한 코드를 작성할 때 메서드를 사용하지 않고 main메서드 안에서만 해결하려 했다면 for문을 각 문장사이마다 출력해야 하는 번거로움이 있었을 것입니다. 이렇게 메서드를 사용하는 것을 수학에서의 치환과정과 같다고 볼 수 있습니다.

 

 위의 코드를 보면 메서드 x()와 main()의 반환형은 void인 것을 알 수 있는데 이때는 return;을 써주지 않아도 정상적으로 작동하는 것을 확인할 수 있습니다.

 

2. 메서드의 종류

 메서드는 어떤 방식으로 호출되느냐에 따라 크게 3가지로 나눌 수 있습니다. 앞서 봤던 코드처럼 단순한 이름을 호출함으로써 실행되는 'Call By Name', 이름에 매개변수가 추가되어 데이터를 처리하는 'Call By Value', 객체의 주소를 이용해 내용 데이터를 변화시키는 'Call By Reference'가 있습니다. 'Call By Reference'는 알아야 할 요소가 많으므로 추후에 배우도록 하겠습니다.

 

 'Call By Name'은 이름을 통해 메서드를 호출하는 방식으로, public static void aaa() 와 같이 매개 변수 없이 이름만으로 호출이 가능한 메서드가 'Call By Name'에 해당됩니다.

 

 'Call By Value'는 메서드의 매개 변수를 이용하는 방식으로 각 매개 변수는 개수, 자료형에 대한 제한이 없고 클래스형이 사용되어도 무관합니다.

 

3. 반환형

 반환형이라는 것은 해당 메서드가 실행이 완료된 후 반환하는 값을 말합니다. 대표적인 예로 2개의 수를 입력받아 더 큰 수를 반환하는 메서드가 있습니다. 이렇게 결과값의 반환이 필요한 메서드에서는 return이라는 에약어를 통해 결과값을 리턴합니다.

 

 이제 이러한 모든 것들을 섞어놓은 예제를 보도록 하겠습니다.

import java.io.IOException;
import java.util.Scanner;

public class Round07_Ex02 {
	
	public static int aaa() throws IOException {  // 둘 중 큰 수를 출력하는 함수
		
		Scanner sc = new Scanner(System.in);
		System.out.print("첫번째 수 : ");
		int a = sc.nextInt();
		System.out.print("두번째 수 : ");
		int b = sc.nextInt();
		
		if(a>b) 
			return a;
		return b;

	}
	
	public static void bbb() throws IOException {  // 두 수 사이의 합을 구하는 함수
		
		Scanner sc = new Scanner(System.in);
		System.out.print("첫번째 수 : ");
		int a = sc.nextInt();
		System.out.print("두번째 수 : ");
		int b = sc.nextInt();
		
		int tot = 0;
		if(a>b) {
			int tmp = a;
			a = b;
			b = tmp;
		}
		
		for(int i=a; i<=b; i++) 
			tot+=i;
		
		System.out.println(a+" - "+b+"사이의 합 : "+tot);
		
	}
	
	public static String ccc(int x, int y, int z) {  // 세 수를 내림차순으로 정렬하는 함수
		if(y>=x&&y>=z) {
			int tmp = x;
			x = y;
			y = tmp;
		} else if(z>=x&&z>=y) {
			int tmp = x;
			x = z;
			z = tmp;
		}
		
		if(z>=y) {
			int tmp = y;
			y = z;
			z = tmp;
		}
		
		String abc = x+">="+y+">="+z;
		return abc;
	}

	public static void main(String[] args) throws IOException {  // 메인 함수
		
		Scanner sc = new Scanner(System.in);
		int x = 0;
		
		while(true) {
			System.out.print("1.최대수  2.사이합  3.수나열  4.종료 : ");
			x = sc.nextInt();
			if(x == 1) {
				int k = aaa();  // 1이 입력되면 aaa함수 호출
				System.out.println("둘 중 최대수는 "+k+"입니다");
			} else if(x == 2)
				bbb();  // 2가 입력되면 bbb함수 호출
			else if(x == 3) {
				System.out.print("첫번째 수 : ");
				int first = sc.nextInt();
				System.out.print("두번째 수 : ");
				int second = sc.nextInt();
				System.out.print("세번째 수 : ");
				int third = sc.nextInt();
				String str = ccc(first, second, third);  // 3이 입력되면 세 수를 입력받고 ccc함수를 호출하면서 매개변수로 전달
				System.out.println("내림차순은 : "+str);
			} else if(x == 4)
				break;  // 4가 입력되면 탈출
			else
				System.out.println("잘못 입력하셨습니다");
			
			System.out.println();
		}
		
	}

}

 위의 코드는 1~4부터 까지의 숫자 중 하나를 입력받아 각 숫자에 맞는 메서드를 실행하는 프로그램입니다. aaa는 더 큰 수를 출력하는 메서드이고, bbb는 두 수 사이의 합을, ccc는 세 수를 내림차순으로 정렬하는 메서드입니다. 이러한 메서드를 통해 코드를 더 효율적이고 간단하게 생성할 수 있습니다.

'프로그래밍 > JAVA' 카테고리의 다른 글

자바 배열  (0) 2019.04.25
자바 메서드 - 문제  (0) 2019.04.22
자바 제어문 - 문제  (0) 2019.04.19
제어문 - 2 ( for, while, do-while )  (0) 2019.04.17
제어문 - 1 ( if, switch-case-break )  (0) 2019.04.17

1. 문자 하나를 입력받아 대문자인지 소문자인지를 판별하는 프로그램

 

 - 코드

import java.io.IOException;
import java.util.Scanner;

public class Test01 {

	public static void main(String[] args) throws IOException {
		
		System.out.print("문자 입력 : ");
		char ch = (char)System.in.read();
		
		if(ch>='A'&&ch<='Z') 
			System.out.println(ch+"는 대문자");
		else 
			System.out.println(ch+"는 소문자");

	}

}

 

2. 연도를 입력받아 윤년인지 아닌지를 판별하는 프로그램( 윤년은 4년마다 한번씩 있고 100으로 나누어떨어지면 윤년이 아니지만, 100으로 나누어떨어지는 년도중 400으로 나누어떨어지는 년도는 윤년 )

 

 - 코드

import java.util.Scanner;

public class Test02 {

	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		int str = 0;
		
		System.out.println("연도 입력 : ");
		str = sc.nextInt();
		
		if((str%100==0)&&(str%400==0)&&(str%4==0)) {
			System.out.println("윤년입니다");
		} else
			System.out.println("운년이 아닙니다");
		
	}

}

 

3. 주민등록번호 8번째 자리를 입력받아 출생지를 알아보는 프로그램( 각 번호는 인터넷에서 검색 )

 

 - 코드 

import java.util.Scanner;

public class Test03 {

	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		
		int num=0;
		System.out.println("주민번호 8째 자리 입력 : ");
		num = sc.nextInt();
		
		if(num>=0&num<=8) 
			System.out.println("서울 출생");
		else if(num>=9&num<=12) 
			System.out.println("부산 출생");
		else if(num>=13&num<=15) 
			System.out.println("인천 출생");
		else if(num>=16&num<=25) 
			System.out.println("경기 출생");
		else if(num>=26&num<=34) 
			System.out.println("강원 출생");
		else if(num>=35&num<=39) 
			System.out.println("충북 출생");
		else if(num==40) 
			System.out.println("대전 출생");
		else if(num>=41&num<=47) 
			System.out.println("충남 출생");
		else if(num==44|num==96) 
			System.out.println("세종 출생");
		else if(num>=48&num<=54) 
			System.out.println("전북 출생");
		else if(num>=55&num<=64) 
			System.out.println("전남 출생");
		else if(num>=65&num<=66) 
			System.out.println("광주 출생");
		else if((num>=67&num<=69)|num==76) 
			System.out.println("대구 출생");
		else if((num>=70&num<=75)|(num>=77&num<=81)) 
			System.out.println("경북 출생");
		else if((num>=82&num<=84)|(num>=86&num<=93)) 
			System.out.println("경남 출생");
		else if(num==85)
			System.out.println("울산 출생");
		else if(num>=94&num<=95)
			System.out.println("제주 출생");

	}

}

 

4. 구구단을 출력하는 프로그램

 

 - 코드

import java.util.Scanner;

public class Test04 {

	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		int num = 0;
		
		System.out.println("단수 : ");
		num = sc.nextInt();

		for(int i=1;i<=9;i++) {
			System.out.println(num+" * "+i+" = "+(num*i));
		}
		System.out.println("===="+num+"단====");
		
	}

}

 

5. 계산기 프로그램을 만들어서 계산을 수행한 후 다시 계산을 할 것인지 물어보는 프로그램

 

 - 코드

import java.util.Scanner;

public class Test05 {

	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		int num = 0;
		int num2 = 0;
		String str = "";
		String anw = "";
		
		do {
			System.out.print("첫번째 수 : ");
			num = sc.nextInt();
			System.out.print("연산자(+, -, /, %, *) : ");
			str = sc.next();
			System.out.print("두번째 수 : ");
			num2 = sc.nextInt();
			
			if(str.equals("+"))
				System.out.println(num+" "+str+" "+num2+" = "+(num+num2));
			else if(str.equals("-"))
				System.out.println(num+" "+str+" "+num2+" = "+(num-num2));
			else if(str.equals("*"))
				System.out.println(num+" "+str+" "+num2+" = "+(num*num2));
			else if(str.equals("/"))
				System.out.println(num+" "+str+" "+num2+" = "+(num/num2));
			else if(str.equals("%"))
				System.out.println(num+" "+str+" "+num2+" = "+(num%num2));
			
			System.out.print("계속하시겠습니까?(y/n) : ");
			anw = sc.next();
			
			System.out.println();
			System.out.println();
		}while(anw.equals("y"));

	}

}

 

 

6. 연도와 월을 입력받아 달력을 출력하는 프로그램, 윤년도 확인해야 하고 요일도 나타나야 합니다.

 

 - 코드

import java.util.Calendar;
import java.util.Scanner;

public class Test06 {

	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		int num1=0;
		int num2=0;
		
		System.out.print("년도를 4자리까지 입력(예 - 2004) : ");
		num1 = sc.nextInt();
		System.err.print("월 입력(예 - 6) : ");
		num2 = sc.nextInt();
		
		Calendar start = Calendar.getInstance();
		Calendar end = Calendar.getInstance();

		// 월은 시스템에서 0을 1로 인식, -1 필요
		start.set(num1, num2-1, 1);
		// getActualMaximum 함수는 해당 날짜의 가장 큰 숫자를 리턴
		end.set(num1, num2-1, start.getActualMaximum(Calendar.DATE));
		
		
		// week_day는 시작날짜의 요일, 몇번째 날인지 지정
		// DAY_OF_WEEK은 숫자로 1이면 월요일부터 7이면 일요일까지 리턴
		int week_day = start.get(Calendar.DAY_OF_WEEK);
		// day는 해당 날짜 
		int day = end.get(Calendar.DATE);
		
		System.out.println("\t"+num1+" 년"+num2+" 월");
		System.out.println("  일   월   화   수   목   금   토");
		System.out.println("-----------------------");
		
		for(int i=1; i<week_day; i++) {
			System.out.print("   ");
		}
		
		for(int i=1, w=week_day; i<=day; i++, w++) {
			System.out.print(i>=10?" "+i:"  "+i);
			
			if(w%7==0) 
				System.out.println();
		}
		
	}

}

 위의 코드는 아래의 주소에서 참조를 했습니다.

http://blog.naver.com/PostView.nhn?blogId=slrkanjsepdi&logNo=90160701047

 

[java] 간단한 달력 프로그램. (Calendar프로그램)

Java로 이용해서 사용자로부터 년과 월을 입력받고 달력의 형태로 표시해주는 방법을 알아보겠다. 달력을 ...

blog.naver.com

'프로그래밍 > JAVA' 카테고리의 다른 글

자바 메서드 - 문제  (0) 2019.04.22
자바 메서드 ( method )  (0) 2019.04.21
제어문 - 2 ( for, while, do-while )  (0) 2019.04.17
제어문 - 1 ( if, switch-case-break )  (0) 2019.04.17
자바 연산자 - 문제  (0) 2019.04.16

1. for

 for 문의 핵심내용은 반복한다는 것입니다. 만약 같은 변수나 문자를 여러번 출력해야 하는데 for문을 사용하지 않으면 System.out.println();을 출력하고자 하는 만큼 코딩해야 할 것입니다. 하지만 for문을 이용하면 매우 간단하게 줄일 수 있습니다. 아래의 형식을 보도록 하겠습니다.

 

 - for ( 초기화; 조건; 증감 ) {

      내용;

   }

 

 위의 초기화 부분에서는 주로 for문에서 사용될 변수의 초기화가 이루어집니다. 이어서 조건에서는 if문에서와 같이 조건이 작동합니다. 이후 증감부분에서는 초기화에 사용되었던 변수의 증감이 이루어지게 됩니다. 하지만 이러한 초기화, 조건, 증감의 부분에서는 꼭 필요한 것은 아닙니다. 각 영역은 공백이 될 수도 있습니다. 아래에서 특징을 살펴보도록 하겠습니다.

 

 - 초기화 : 공백 가능, 변수 선언과 동시에 초기화 가능( int i = 0 ), 이미 선언된 변수라면 초기화 작업만 가능

 - 조건 : 공백 가능, 논리형 조건 사용 가능

 - 증감 : 공백 가능, 증감 연산자의 사용 가능( x++, ++x ), 수식 사용 가능( x += y )

 

 위처럼 각 영역은 공백이 가능하기도 하고 굳이 정수형이 아닌 String형도 가능하기도 합니다. 그렇다면 이번에는 for문의 실행과정에 대해 알아보도록 하겠습니다.

 

 - for ( ① ; ② ; ④ ) {
      ③;

   } 

 

 이렇게 숫자의 순서대로 작동하게 됩니다. 우선 초기화 부분을 거쳐 초기화가 이뤄지고 난 후 조건에 들어가서 해당 조건이 참인지 거짓인지를 판별합니다. 이후 해당 조건이 참이라면 3번의 내용 부분으로 가서 내용을 수행한 후 증감인 4번으로 가서 증감을 수행하게 됩니다. 이러한 과정을 반복하며 2번에서 조건이 거짓이 나올때까지 반복하게 됩니다. 하지만 이때 1번인 초기화 부분은 처음에만 실행되며 한바퀴를 돌고 난 후에는 작동하지 않습니다.

 

 이번에는 삼각형을 출력하는 코드를 살펴보도록 하겠습니다.

public class Triangle {

	public static void main(String[] args) {
		
		int i=0,j=0;
		
		for(i=0;i<5;i++) {
			for(j=0;j<=i;j++) {
				System.out.print("*");
			}
			System.out.println();
		}

	}
}

 이 코드는 프로그래밍을 처음 배울 때 쉽게 접하는 삼각형을 출력하는 코드입니다. 이 코드를 살펴보면 for문이 2개가 중첩돼있는 것을 알 수 있습니다. 이는 삼각형을 한줄한줄 순차적으로 표시하기 때문에 이렇게 작성하게 되는 것입니다. 그렇다면 이번에는 좀 다른 코드를 살펴보도록 하겠습니다.

public class ABCD {

	public static void main(String[] args) {
		
		for(char i='A'; i<='Z'; i++) {
			System.out.print(i);
		}
	}

}

 위의 코드는 알파벳을 A부터 Z까지 일렬로 출력하는 프로그램입니다. 이처럼 for문의 초기화, 조건 부분에는 꼭 숫자가 아닌 문자가 와도 상관없습니다.

 

2. while

 while문은 for문과 비슷한 개념의 반복문이지만 while문에는 초기화와 증감이 존재하지 않습니다. 우선 아래의 형식을 보도록 하겠습니다.

 

 - while( 조건 ){
      내용;

   }

 

 위의 while문의 조건에는 논리형 조건식과 수치형 조건식 모두 사용이 가능합니다. 또 C언어에서는 while(1)이 가능했지만 자바에서는 이를 허용하지 않기 때문에 while(true)와 같이 true혹은 false로 대입해주어야 합니다.

 

3. do ~ while

 do~while은 while과 거의 흡사합니다. 하지만 차이점은 이 do~while문은 안의 내용을 우선 한번 실행하고 난 후 조건을 따지게 되지만 while문은 조건을 우선적으로 따져서 조건이 거짓이라면 안의 내용부를 실행조차 하지 않게 됩니다. 그렇다면 이 do~while문의 예제를 보도록 하겠습니다.

import java.io.*;

public class Round06_Ex07 {

	public static void main(String[] args) throws IOException {
		
		BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
		int kor = 0, eng = 0, mat = 0, tot = 0;
		char point = 0;
		float ave = 0.0f;
		
		do {
			System.out.print("국어 = ");
			kor = Integer.parseInt(in.readLine());
		} while(kor < 0 || kor > 100);
		
		do {
			System.out.print("영어 = ");
			eng = Integer.parseInt(in.readLine());
		} while(eng < 0 || eng > 100);
		
		do {
			System.out.print("수학 = ");
			mat = Integer.parseInt(in.readLine());
		} while(mat < 0 || mat > 100);
		
		tot = kor + eng + mat;
		ave = tot/3.0f;
		
		switch((int)(ave/10)) {
		case 10:
		case 9 : point = 'A'; break;
		case 8 : point = 'B'; break;
		case 7 : point = 'C'; break;
		case 6 : point = 'D'; break;
		default : point = 'F';
		}
		
		System.out.println();
		System.out.println("총점 = "+tot);
		System.out.printf("평균 = %.2f\n", ave);
		System.out.println("학점 = "+point+"학점");

	}

}

 위의 코드는 각 영역의 점수를 입력받아 총점과 평균을 계산하고 그에 따른 학점을 계산하는 프로그램입니다.

'프로그래밍 > JAVA' 카테고리의 다른 글

자바 메서드 ( method )  (0) 2019.04.21
자바 제어문 - 문제  (0) 2019.04.19
제어문 - 1 ( if, switch-case-break )  (0) 2019.04.17
자바 연산자 - 문제  (0) 2019.04.16
자바 연산자 - 2  (0) 2019.04.15

1. 숫자 하나를 입력받아 그 수가 1이면 "남성", 2이면 "여성"을 출력하는 프로그램

 

 - 해답

import java.util.Scanner;

public class Test3 {

	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		
		int i = sc.nextInt();
		
		System.out.println(i==1?"남성":"여성");

	}

}

 

2. 문자 하나를 입력받아 그 문자가 산술 연산자인지 아닌지를 판단하는 프로그램

 

 - 해답

import java.io.*;
import java.util.Scanner;

public class Test4 {

	public static void main(String[] args) throws IOException {
		
		Scanner in = new Scanner(System.in);
		String str = "";
		
		System.out.println("산술 연산자 입력(+, -, *, /, %) : ");
		str = in.nextLine();
		
		if("+".equals(str))
			System.out.println("산술 연산자임");
		else if("-".equals(str))
			System.out.println("산술 연산자임");
		else if("*".equals(str))
			System.out.println("산술 연산자임");
		else if("/".equals(str))
			System.out.println("산술 연산자임");
		else if("%".equals(str))
			System.out.println("산술 연산자임");
		else
			System.out.println("산술 연산자가 아님");
		
	}

}

 

 이번 문제풀이에서는 BufferedReader 대신에 Scanner라는 입력클래스를 사용하였습니다. 이유는 BufferedReader보다 훨씬 간편하고 사용하기도 편리하기 때문입니다. 

 

 문제 2번에서 if문은 아직 포스팅하지는 않았지만 저걸 사용하지 않으면 도저히 풀 방법이 없는 것 같아서 사용하였고 if문에 "+".equals(str)과 같이 산술 연산자를 사용하지 않은 이유는 if(str == "+")과 같이 코드를 작성하면 오류가 발생하여 해결되지 않아 저렇게 대체하였습니다.

'프로그래밍 > JAVA' 카테고리의 다른 글

제어문 - 2 ( for, while, do-while )  (0) 2019.04.17
제어문 - 1 ( if, switch-case-break )  (0) 2019.04.17
자바 연산자 - 2  (0) 2019.04.15
자바 연산자 - 1  (0) 2019.04.14
자바 기본 입출력 - 문제  (0) 2019.04.11

+ Recent posts