안녕하세요. 😄 오늘은 class를 구성하는 변수와 함수에 대해 포스팅하도록 하겠습니다.
1. 예약어
2. 기호, 문자, 문자상수
3. 빌트인 리소스(클래스, 인터페이스, 상수, 함수 ...)
4. 식별자 : identifier
1,2,3번의 경우, JAVA의 규칙에 따라 글자를 똑같이 써야한다. 4번의 경우에만 개발자 마음대로 사용해도 된다.
JAVA에서 Class 키워드로 파일을 만드는 것은 자바 프로그램의 최소 단위입니다.
class의 구성원은 변수와 함수입니다. class가 메모리에 올라가면 객체(Object)라고 부릅니다.
JAVA와 같은 객체지향 언어에서 함수는 메소드(method)라고 부릅니다.
예시로, 큰 필통과 작은 필통 그리고 각 필통에 필기구가 있다고 합시다.
큰 필통안에 작은 필통을 넣고 필통을 닫는다고 했을 때, 큰 필통에 있는 필기구를 사용할 경우, 큰 필통안에서 꺼내 써야 합니다. 한편, 작은 필통안에 있는 필기구를 사용할 경우,
큰 필통을 안에, 작은 필통안에서 필기구를 꺼내서 사용해야 할 것입니다.
이를 JAVA에서 바라본다면,
필통에서 | JAVA에서 |
---|---|
큰필통 | class |
작은필통 | method |
큰필통에있는필기구 | class내 변수 |
작은필통안에있는필기구 | method내 변수 |
라고 할 수 있습니다.
함수의 일반적인 정의는 하나의 기능을 수행하는 일련의 코드로 기능을 모아 두는 곳입니다. 함수는 또 다른 말로 데이터를 담아 두는 상자라고 할 수 있습니다.
(필통 예시에서 작은 필통)
함수를 선언하는 방법
함수는 클래스 블럭 안에서 선언합니다. 함수 이름 앞에는 접근 제한자 키워드, 수정자 키워드, 리턴형 키워드 순으로 선언할 수 있습니다.
키워드종류 | 키워드이름 |
---|---|
접근제한자 | public, protected, default, private |
수정자 | static, final |
리턴형 | void, 기초자료형, 참조자료형, 사용자정의 클래스 데이터 |
final
final은 더이상 수정하지 말라는 의미의 수정자 키워드입니다.
void
public class HelloJava{
public static void main(String args[]){
System.out.println("Hello Java");
}
}
앞의 포스팅에서 Keywords에 대해 소개할 때, 해당 코드에서 void를 설명하지 않았었는데요. void의 경우 함수의 구조를 알아야 하기 때문에 해당 내용을 포함하지 않았었습니다.
함수의 구조
함수는 크게 return 값이 있는 경우와 return 값이 없는 경우로 나눌 수 있습니다.
매개변수가 input으로 들어갈 때, 반환값을 return 예약어를 사용할 때와 매개변수가 input으로 들어갈 때, 반환값을 return 예약어를 사용하지 않는 경우로 나눌 수 있는데요.
return 값이 없는 경우 void라는 수정자 키워드를 사용합니다.
void는 비어 있다는 의미로 '반환할 값이 없다'는 뜻의 예약어 입니다.
함수 블럭 {} 안에서는 interpret 방식으로 실행됩니다.
interpret 방식은 한줄씩 읽어가면서 실행하는 형식으로 실행됨을 의미합니다.
// 클래스와 다른 함수 생략...
public static void main(String args[]) {
System.out.println(">>> : " + i);
int i=10;
}
JAVA에서 interpret 방식을 더 구체적으로 설명하기 위해, JAVA 콘솔 어플리케이션 실행 순서를 먼저 설명하도록 하겠습니다.
JAVA 콘솔 어플리케이션 실행 순서
JAVA는 객체지향 언어입니다. JAVA는 함수 블럭 안에서만 인터프리트 방식으로 수행됩니다.
자바 콘솔 어플리케이션은 main 함수부터 시작하여 호출한 순서대로 진행됩니다.
컴파일 단계에서가 아니라 실행 단계에서 main함수 부터 시작하여 호출한 순서대로 진행됩니다.
public class Method_Practice{
public static void aM(){
System.out.println("aM() Method 함수");
}
public static void bM(){
System.out.println("bM() Method 함수");
}
public static void cM(){
System.out.println("cM() Method 함수");
}
public static void dM(){
System.out.print("저는 dM함수입니다. aM,bM,cM 함수 전부 불러오겠습니다.");
System.out.print("aM,bM,cM 함수 전부 호출");
System.out.print("\n");
aM();
System.out.print("\n");
bM();
System.out.print("\n");
cM();
}
public static void main(String args[]){
System.out.println("1. 첫 번째 라인에서 Mehod_Practice_1 클래스 블럭에 있는 main() 함수 시작 >>> : ");
System.out.println("2. aM함수 호출");
Method_Practice_1.aM();
System.out.println("3. cM함수 호출");
Method_Practice_1.cM();
// bM이 cM보다 위에 있지만, 호출을 cM을 먼저하면, cM이 먼저 출력된다.
// 유의해야 할 점은 컴파일과정에서가 아니라 실제 실행과정에서 main -> 호출 순으로 출력되는 것이다.
System.out.println("4. aM,bM,cM 전부 호출");
Method_Practice_1.dM();
}
가령, 위와 같은 코드가 있을 때, 자바실행시, main() 함수부터 시작을 합니다.
위의 코드를 통해 interpret 방식이 어떤 식으로 진행되는지 설명한다면,
함수에서 리턴을 사용하실 때, 유의해야 할 점은
return 키워드의 반환값 데이터 형과 리턴형의 데이터 형이 항상 동일해야 한다는 것입니다.
함수에서 리턴이 없을 경우, void를 쓰지만, 리턴이 있을 경우, 다른 함수에서 함수의 리턴값을 활용할 수 있습니다.
1부터 10까지 함수들을 연결해서 출력하는 예제를 통해 이를 살펴보도록 하겠습니다.
1부터 10까지 함수들을 연결해서 출력하는 예제
package a.b.c.ch1;
public class Add_One_To_Ten{
public static int oneS(){
// 식별자 함수 이름앞에 int 붙여준뒤, int 값을 넣고, int 값을 리턴해야한다.
int a=1;
return a;
}
public static int twoS(){
int b=Add_One_To_Ten.oneS();
int n_2=2;
return b+n_2;
}
public static int threeS(){
int c=Add_One_To_Ten.twoS();
int n_3=3;
return c+n_3;
}
public static int fourS(){
int d=Add_One_To_Ten.threeS();
int n_4=4;
return d+n_4;
}
public static int fiveS(){
int f=Add_One_To_Ten.fourS();
int n_5=5;
return f+n_5;
}
public static int sixS(){
int g=Add_One_To_Ten.fiveS();
int n_6=6;
return g+n_6;
}
public static int sevenS(){
int h=Add_One_To_Ten.sixS();
int n_7=7;
return h+n_7;
}
public static int eightS(){
int i=Add_One_To_Ten.sevenS();
int n_8=8;
return i+n_8;
}
public static int nineS(){
int j=Add_One_To_Ten.eightS();
int n_9=9;
return j+n_9;
}
public static int tenS(){
int k=Add_One_To_Ten.nineS();
int n_10=10;
return k+n_10;
}
public static void main(String args[]){
int sum_2=Add_One_To_Ten.twoS();
int sum_3=Add_One_To_Ten.threeS();
int sum_4=Add_One_To_Ten.fourS();
int sum_5=Add_One_To_Ten.fiveS();
int sum_6=Add_One_To_Ten.sixS();
int sum_7=Add_One_To_Ten.sevenS();
int sum_8=Add_One_To_Ten.eightS();
int sum_9=Add_One_To_Ten.nineS();
int sum_10=Add_One_To_Ten.tenS();
// 함수에서 return한 값을 int로 지정한 sum_n에 대입한다.
System.out.println("1부터 2까지 합 : "+sum_2+"\n");
System.out.println("1부터 3까지 합 : "+sum_3+"\n");
System.out.println("1부터 4까지 합 : "+sum_4+"\n");
System.out.println("1부터 5까지 합 : "+sum_5+"\n");
System.out.println("1부터 6까지 합 : "+sum_6+"\n");
System.out.println("1부터 7까지 합 : "+sum_7+"\n");
System.out.println("1부터 8까지 합 : "+sum_8+"\n");
System.out.println("1부터 9까지 합 : "+sum_9+"\n");
System.out.println("1부터 10까지 합 : "+sum_10+"\n");
}
}
이런 식으로 다른 함수에서 리턴값을 받아 int 알파벳=해당클래스.다른함수(); 선언 후,
사용할 수 있습니다.
함수에서는 매개변수(parameter)를 선언하여 사용할 수 있습니다.
함수를 선얼할 때, 소괄호에 데이터 타입을 선언하고, 변수명을 선언하는 것을 파라미터라고 부릅니다.
매개변수 : 연결해 주는 변수
함수를 호출할 때, 함수 이름 뒤 소괄호에 들어가는 값 또는 변수를 인수(argument)라고 부릅니다.
argument의 변수명과 parameter 변수명은 동일하지 않아도 됩니다.
사칙연산이 가능한 계산기 클래스를 통해 함수에서 매개변수를 어떻게 사용하는지 살펴보도록 하겠습니다.
매개변수를 사용하여, 사칙연산 결과를 출력하는 예제
package a.b.c.ch1;
public class Calculator{
public static int addN(int x, int y){
// x, y가 int임을 선언
int add=x+y;
// add가 int임을 선언
return add;
}
public static int timesN(int x, int y){
int times=x*y;
return times;
}
public static int minusN(int x,int y){
int minus=x-y;
return minus;
}
public static float devideN(float x,float y){
float devide=x/y;
return devide;
}
public static void main(String args[]){
int a=10;
int b=2;
System.out.println("add : "+Calculator.addN(a,b)+"\n");
System.out.println("times : "+Calculator.timesN(a,b)+'\n');
System.out.println("minus : "+Calculator.minusN(a,b)+'\n');
System.out.println("devide : "+Calculator.devideN(a,b)+'\n');
}
} // end of Calculator
코드를 보시면 마지막에 main 함수에서 int a=10;과 int b=2;로 선언하고 각 함수에 대입하여도
문제없이 실행되는 것을 보실 수 있습니다. 즉, 함수에서는 x,y를 파라미터 변수명으로 설정하였으나, 실제 파라미터의 변수명에 인수가 x,y가 아닌 a,b여도 상관이 없다는 의미입니다.
여기서, 매개변수는 실제 함수로 넘어온 두 값을 받아주는 역할 입니다. x,y는 함수에서 선언한 새로운 변수이기 때문에, argument의 변수명과 parameter의 변수명이 달라도 괜찮은 것입니다.
함수와 마찬가지로 변수 또한 데이터를 담는 상자입니다.
데이터에는 여러 종류가 있습니다.
데이터:
문자
문자를 담는 상자
문자열을 담는 상자
숫자
정수를 담는 상자
실수를 담는 상자
파일
이미지를 담는 상자
문서를 담는 상자
동영상을 담는 상자
음성을 담는 상자
등등
JAVA에서의 데이터 종류는 다음과 같습니다.
Data:
숫자
정수
byte
short
int
long
실수
float
double
문자
문자
char
JAVA에서 데이터 종류는 기초 자료형과 참조 자료형이 있습니다.
기초자료형 : primitive type
byte
char
short
int
long
float
double
boolean
참조자료형 : reference type
String
자료형 선언 변수명 선언;
or
자료형 선언 변수명 선언 = 변수의 값;
이전 포스팅에서도 언급했듯이, JAVA는 블록 언어이자, 스코프 언어이자, 범위 언어입니다.
변수의 경우, 어떻게 사용하냐에 따라 유효범위가 다릅니다.
JAVA 변수
자바에서 변수는 상수, 클래스 변수, 전역 변수, 멤버 변수, 지역 변수로 나뉩니다.
자바에서 자바 클래스에 내부에 선언하는 변수를 Filed(필드)라고 부릅니다.
각 변수에 대한 설명과 유효범위는 다음과 같습니다.
멤버변수
int i_var_MemberVariable;
멤버변수는 클래스 블럭 내부와 함수 블럭 외부에 선언하는 변수입니다.
한국의 경우, 멤버변수의 종류로는 상수, 클래스변수, 전역변수, 멤버변수로 나눕니다.
클래스 변수(스태틱 변수)
static int i;
혹은
static int i_var_staticVariable;
클래스 변수의 경우, static이 붙어서 스태틱 변수라고도 읽습니다.
접근 제한자인 public을 쓰지 않았기 때문에, 해당 패키지 내에서만 작동합니다.
상수
public static final int CONSTRUCTOR_VARIABLE = 10;
상수로 지정하고 final 이라는 수정자 키워드를 붙여 바꾸지 말라고 선언합니다.
전역 변수
public int i_var_staticVariable;
public이라는 접근 제한자를 통해 어디서든 사용가능하게 지정합니다.
각 변수들은 유효범위를 잘 인지하고 사용해야 합니다.
// 클래스와 다른 함수 생략..
public static void main(String args[]) {
int i = 10;
System.out.println(">>> : " + i);
{
int ii = 1000;
System.out.println("{} 안에서 i는 >>> : " + i);
}
System.out.println(">>> : " + ii);
}
위와 같은 코드가 있다고 했을 때, ii는 출력되지 않습니다.
지역변수는 블록 범위 내에서만 출력할 수 있는 데, 블록 범위 밖에서 출력을 시도했기 때문입니다.
반대로, main함수 블록 안에 있는 블록에서 i는 출력이 됩니다.
전역변수는 블록 안에 블록에서도 출력이 가능하기 때문입니다.
변수를 전역변수에서 선언해준뒤, 지역변수에서 update하는 것은 가능합니다.
i를 전역변수로 선언해준뒤, 해당 블록 안에 있는 블록에서 업데이트만 해줬기 때문입니다.
유의해야 할 것은 int i=10;이라고 전역변수에서 선언을 해준 뒤, 지역변수에서 int i=100;이라고 중복 선언하는 것은 불가능합니다.
내용이 어려울 수 있으니 쉬운 예시를 통해 설명해보도록 하겠습니다.
경기도 지역화폐와 원화
쉬운 예시로, 경기도 지역화폐를 들고 부산에서 결제를 시도한다면, 결제가 되지 않을 것입니다.
반대로, 전국 단위의 완화를 들고 결제를 시도한다면, 경기도와 부산 어디든지 결제가 가능할 것입니다. 이처럼 자바에서 변수를 사용할 때는 변수의 유효 범위를 정확히 인지하고 사용하는 것이 중요합니다.
이상으로 변수와 함수에 대한 포스팅을 마치도록 하겠습니다. 😀