티스토리 뷰
책에 함수에 대한 내용이 없는 것 같아 여기서 설명하겠습니다.
public class FirstClass {
public static void main(String[] args) {
int result = plus(10, 20);
System.out.print(result);
}
private static int plus(int a, int b){
return a + b;
}
}
자바에서 함수는 클래스 내부에 위치해야 하고, main함수는 특별히 public 이 붙은 클래스에만 생성이 가능합니다.
위 예시에서 static이라는 키워드를 함수에 쓴 이유는 메인 함수는 무조건 static이여야 하는데, 이 static은 static 끼리 주고 받을 수 있어 사용한 것입니다. main함수가 있는 클래스 내에서 서로 주고 받으려면 static 키워드를 꼭 사용해야 합니다. 이 키워드는 정적 멤버라고 하는데 이에 대해서는 나중에 자세히 알려드리겠습니다.
함수는 "접근지정자 리턴타입 함수이름(매개변수1 타입 매개변수1 이름, 매개변수2 타입 매개변수2 이름) { 내용 }" 와 같은 형식을 띕니다. (다른 것들이 더 붙을 수 있지만 지금은 이렇게 기본적인 것만 알고 있으면 좋습니다.)
접근지정자 반환타입 함수명(매개변수1타입 매개변수이름, 매개변수2타입 매개변수이름){
내용
return 반환타입과 동일한 값;
}
public int sum(int a, int b) {
int c = a + b;
return c;
}
접근지정자는 나중에 배울 것이고 없어도 되는 경우도 있습니다. 리턴타입은 함수를 다 실행시키고 결과를 함수를 썼던 곳에 넘겨주고싶을 때 그 결과의 타입을 적는 것입니다.
여기에 void가 오면 아무것도 리턴하지 않고, 그렇지 않으면 무조건 return을 통해 값 반환해야합니다.
void 함수에서도 아무 반환 값 없게 return; 가 가능하고, return은 함수를 "종료" 시킵니다. 중간에 return이 실행되면 밑의 코드들은 실행되지 않습니다.
매개변수는 함수를 쓸 때 넣고 싶은 값입니다. 매개변수의 타입에 맞게 값을 넣어주면 되고 매개변수는 여러개 있을 수도 있고 없을 수도 있습니다.
매개변수의 이름이 넣은 값의 이름이 됩니다. 여기서는 a가 10이 되고 b가 20이 됩니다. 매개변수의 이름은 해당 함수 안에서만 사용할 수 있는 이름입니다.
return a + b; 는 a와 b를 더해서 plus(10, 20) 에 넘겨줍니다. 결국 plus(10, 20)은 30이 되고 이 값이 result 에 대입이 됩니다.
private는 클래스 외부에서 불러올 수 없습니다. 굳이 여기에 붙인 이유는 외부에서 불러올 이유가 없는 함수나 필드에는 보안상의 이유로 붙여주는 것이 좋습니다. 여기서 필드는 나중에 설명할게요! 보안은 그냥 진짜 나중에 회사 들어가서 고려하면 된다 생각하실 수 있지만, 좋은 습관을 들여놓읍시다. private에 대해서는 나중에 자세히 배울거에요!
그렇다면 이 함수는 접근지정자가 private이고 int 타입의 값을 넘겨줄 것이며 plus라는 이름을 가져 다른 곳에서 부를 때 plus(???, ???)라고 부르면 되고 int형인 두 매개변수를 더해서 넘겨주는 함수이네요.
public class FirstClass {
public static void main(String[] args) {
int a = 10, b = 20;
System.out.println(plus(a, b));
}
private static int plus(int c, int d){
return c + d;
}
}
a 와 b를 plus함수 내에서는 쓸 수 없습니다. 즉, plus함수에서 return a + b; 라고 하면 오류가 뜹니다. 위 코드에서는 a는 c로, b는 d로 치환되어서 사용하는 것입니다. c와 d는 plus함수 내에서만 쓰일 수 있습니다. 이 부분은 꽤 중요하니 잘 이해해주세요! 위 코드의 출력 결과는 plus(a, b)가 30을 반환하기에 30입니다.
여기서 문제. 함수는 왜 쓸까요? 혹시 생각나시면 말씀해주세요. 처음에는 모르는 것이 당연합니다!
함수는 코드의 중복을 없애고 간결성을 높이는 역할을 합니다. 가독성 또한 높일 수 있습니다. 함수 내에 엄청 많은 연산이 들어가있으면, 이것을 매번 같은 코드를 반복해 치는 것 보다는 함수만 그 횟수만큼 호출하는 것이 편할 것입니다.
int a = plus(1, 2);
plus(1, plus(3, 2));
반환 값이 void가 아니면 반환 타입과 일치한 변수에 함수를 수행한 값을 대입시킬 수 있습니다. 대입시키지 않고 수행만 할 수도 있습니다.
a는 3, 밑의 식의 결과는 6이지만 어디에도 대입되지 않아 무의미하게 연산만 할 뿐입니다. 여기선 함수 안에서 함수를 실행시킬 수 있다는 것만 알아두면 됩니다.
- 입력
자바에서 입력받을 때 Scanner를 사용하는 것이 일반적입니다.
import java.util.Scanner;
public class FirstClass {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
}
}
이렇게 스캐너를 생성합니다. scan은 다른 이름으로 바꿔도 무방합니다. 위에 import로 스캐너를 불러와줘야 합니다.
위와 같이 new로 생성해야하고, new를 써서 생성해야하면 객체라고 생각하시면 됩니다. 객체는 나중에 배울 것입니다. 이제부터 scan을 스캐너 객체라고 부릅시다.
생성한 스캐너로 입력을 받아봐야겠죠?
import java.util.Scanner;
public class FirstClass {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int input = scan.nextInt();
System.out.println("input = " + input);
scan.close();
}
}
이 코드를 실행하면 입력받은 "정수"를 "input = " 와 함께 출력합니다.
코드를 분석하면 우선 스캐너를 생성하고, scan이란 객체를 통해 nextInt()라는 함수를 호출합니다. 이렇게 정수를 입력받아 input이라는 int형 변수에 저장하고, 끝으로 출력하는 것입니다.
스캐너로 다양한 타입의 값을 받을 수 있는데, 그 함수들은 다음과 같습니다.
String next()는 scan.next() 이렇게 쓰면 되고, String을 반환해준다는 의미입니다.
여기서 nextLine()은 공백이 있어도 계속 입력 받다가 엔터를 누르면 입력이 종료된다는 특징이 있습니다.
next()와 nextLine()을 잘 구분해 주세요.
핵심은 스캐너 타입을 하나 생성해서 그것을 이용해 위의 메소드(함수)들을 활용해 쓸 수 있다는 것입니다. 스캐너를 여러개 생성할 수는 있는데, 같은 함수 내에서는 아마 비효율적일 것입니다.
또한 스캐너를 다 사용하셨으면 위의 scan.close(); 처럼 스캐너를 종료시켜주세요! 종료문이 없어도 되지만 메모리를 잡아먹으면 안좋겠죠?
- 연산
연산이란 우리가 아는 수학 연산과 같은 연산을 수행하는 것을 뜻합니다. 자바에서 정해진 기호들만 사용할 수 있습니다.
아래 표에 있는 것들은 두 변수나 수를 이용하므로 이항 연산자입니다.
기본 적인 것들은 여기에 있고 저희가 원래 사용하던 기호들도 있고, 처음 보는 것들이 있을 수 있습니다!
이 부분은 외워주세요!
증감 연산자(단항 연산자입니다.)
public class FirstClass {
public static void main(String[] args) {
int a = 1;
int b = a;
int c = b;
// a, b, c 모두 1
a++;
b += 1;
c = c + 1;
//a, b, c 모두 2
int d, e;
d = ++a;
e = a++;
//d, e 모두 3
}
}
증감 연산자는 ++ 혹은 -- 와 같이 나타내고 각각 1을 더하거나 빼줍니다.
단, ++와 -- 는 변수 앞에 붙을 때(전위 연산자)랑 뒤에 붙을 때(후위 연산자)가 살짝 다릅니다.
모두 1을 더하거나 빼주지만, 앞에 붙이면 먼저 1을 더하거나 빼준 후에 다음 연산을 수행하고,
뒤에 붙이면 연산을 수행한 후에 1을 더하거나 빼줍니다.
위의 d 와 e 가 같은 값인 이유입니다.
이를 설명해주는 그림입니다.
참고로 b에서 +=를 쓴 것은
b += 3;
b = b + 3;
//위와 아래 같은 뜻
이런 뜻입니다. 두 방식 모두 b의 원래 값에 3을 더해 저장하는 것입니다. += 와 같은 것을 대입 연산자라고 합니다.
삼항연산자도 있긴 합니다. 아래와 같습니다.
int a = 10;
int b = (a < 20) ? 1 : 2;
a < 20 가 맞으면 1 아니면 2라는 뜻입니다.
int a = (10 + 30) * 3;
먼저 수행하고 싶은 연산을 괄호로 묶어줄 수 있습니다.
- 비교 연산과 논리 연산
비교 연산자와 논리 연산자의 결과는 boolean값입니다. 즉, true 아니면 false입니다.
public class FirstClass {
public static void main(String[] args) {
boolean flag = 1 < 4;
System.out.println("flag = " + flag);
}
}
다음 예시의 출력 결과는 어떻게 될까요?
다음과 같습니다. 즉 비교 연산자와 논리 연산자는 true나 false로 변환됩니다. 이것은 매우 중요한 포인트입니다.
나중에 if문과 while문 같이 조건이 필요한 식에 자주 사용될 예정입니다.
1 < 4는 당연히 옳으니 true이고 1 < 4는 결국 true로 치환되었다고 생각하시면 편합니다.
- 연산자 우선순위
수학에서 곱하기나누기를 덧셈 뺄셈보다 먼저하듯 연산자도 우선순위가 있습니다.
그렇다면 예제 하나를 풀어봅시다!
Int x=2, y=10, z=0;
z = x++*2+--y-5+x*(y%2);
여기서 z는 몇일까요?
우선 x++에서 x가 2인 상태에서 2를 곱한 후 x가 1이 증가해 계산은 4가 되고 x는 그 후 3이 됩니다. --y는 먼저 y가 1 줄은 다음에 식이 계산되어 이전에 계산한 4에서 9를 더해 13이 되고 y는 9가 됩니다. 그 후 5를 13에서 빼 8이 되고, x는 이미 3이 되었고, y는 9가 되었으므로 x*(y%2)는 3*(9%2)가 됩니다. 9는 2로 나눈 나머지가 1이고 괄호 안에 계산이 끝나고 3과 곱해져 3이 되고, 원래 계산해 놓은 8에 더하면 11이 됩니다.
- 조건문
드디어 조건문에 왔네요! 조건문은
if ( 조건식 ) {
실행 문장
}
와 같이 생겼습니다. 조건식에는 boolean이 들아가게 되는데, 방금 저희가 봤던 1 < 4가 들어가도 됩니다. 이렇게 true가 조건식에 들어가면, if 문 안의 실행 문장이 실행됩니다. 하지만 false이면 실행되지 않는다는 특징이 있습니다.
다음으로, else문에 대해 알아보겠습니다.
우선 else문이 있는 이유는 if를 썼는데 false가 들어왔을 때 true가 아닌 경우에 실행시키고 싶은 문장을 실행하기 위함입니다. 간단한 예시를 보겠습니다!
import java.util.Scanner;
public class FirstClass {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int i = scan.nextInt();
int j = scan.nextInt();
if ((i + j) > 10) {
System.out.println("두 값의 합이 10보다 큽니다.");
}
else {
System.out.println("두 값의 합이 10보다 작거나 같습니다.");
}
}
}
입력받은 두 값의 합을 비교해 10보다 큰지 작거나 같은지 알아보는 예제입니다.
10보다 작거나 같을 때만 두번째 출력문을 실행시키고 싶으면 저렇게 하면 됩니다.
else문은 없어도 되지만 있으려면 if문이 위에 꼭 쌍을 이뤄야 합니다.
public class FirstClass {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int i = scan.nextInt();
int j = scan.nextInt();
if ((i + j) > 10){
System.out.println("두 값의 합이 10보다 큽니다.");
}
System.out.println("두 값의 합이 10보다 작거나 같습니다.");
}
}
만약 else가 없었다면 어떻게 될까요?
10보다 크면 위에 출력문과 밑의 출력문이 같이 출력되고, 아니면 아래 출력문만 출력됩니다.
다음으로 if else 문에 대해 알아봅시다.
if else 문은 if 문과 else문 사이에 위치할 수 있는 친구입니다.
public class FirstClass {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int i = scan.nextInt();
int j = scan.nextInt();
if ((i + j) > 10){
System.out.println("두 값의 합이 10보다 큽니다.");
}
else if((i + j) < 0 && (i + j) != -1){
System.out.println("두 값의 합이 -1보다 작습니다.");
}
else{
System.out.println("i + j < 10 && i + j >= 0");
}
}
}
이제 감이 오실 것 같은데, if문이 실행되고 나서 또 다른 조건을 걸어 특정 문장을 실행시키고 싶을 때 else if 문을 활용하면 됩니다. else if 를 썼다고 해서 꼭 else가 있어야 하는 것은 아닙니다. 하나의 if문 아래에 else if는 여러개 사용 가능합니다.
소소한 팁)
public class FirstClass {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int i = scan.nextInt();
int j = scan.nextInt();
if ((i + j) > 10)
System.out.println("두 값의 합이 10보다 큽니다.");
else if((i + j) < 0 && (i + j) != -1)
System.out.println("두 값의 합이 -1보다 작습니다.");
else
System.out.println("i + j < 10 && i + j >= 0");
}
}
if문은 실행 문장이 한 문장일 경우 중괄호를 안 쳐도 됩니다.
소소한 팁2)
public class FirstClass {
public static void main(String[] args) {
if(true){
if(true){
if(true && true){
System.out.println("이 출력문은 무조건 출력됩니다.");
}
}
else{
System.out.println("이 출력문은 2번째 if 문이 실행되지 않으면 실행됩니다.");
}
}
}
}
if문 조건 안에는 true, false를 넣을 수 있고 true면 무조건 실행되겠죠? 저렇게 몇번이고 중첩이 가능합니다.
중첩했을 때 else나 else if는 저렇게 원하는 if문과 줄을 맞춰 작성하면 됩니다. 그리고 여러 조건을 하나의 if문에 쓰고 싶으면 && 이나 || 를 쓰면 되는데요, &&는 두 조건 다 만족해야 실행되는 and, || 는 두 조건 중 하나만 만족하면 되는 or와 같습니다. &&와 || 는 여러번 사용 가능해서 하나의 if문에 여러 조건을 넣을 수 있습니다.
여기서 문제!
public class Error {
public static void main(String[] args) {
maybe();
here();
}
private static int maybe(){
if(1 < 5){
return 1;
}
}
private static void here(){
if (1 < 5){
return;
}
}
}
이 코드의 문제점은 무엇일까요?
1. 제일 중요한 문제점은 maybe 함수에서 모든 곳에서 return을 해주지 않은 것입니다. if문이 만족하지 않음 아무것도 반환해줄 수 없겠죠? -> 이 문제 때문에 실행이 안될 것입니다.
2. void 함수가 의미가 없습니다. return도 필요없고,,, 근데 이건 실행시 오류가 나지는 않습니다.
- switch, case 문
switch case문은 다음과 같은 구조를 가집니다.
예시를 하나 들면
public class FirstClass {
public static void main(String[] args) {
int a = 10;
switch(a){
case 10:
System.out.println("10");
break;
case 20:
System.out.println("20");
break;
case 30: {
System.out.println("30");
break;
}
default:
System.out.println("응 다 틀렸어");
break;
}
}
}
이렇게 쓸 수 있는데, a가 조건이 되어서 a의 케이스에 맞는 곳에 들어가 실행합니다. a 가 10이면 case 10: 에 부합해서 밑에서 10을 출력하게 됩니다.
꼭 break 문을 각 케이스에 써주세요!
default는 모든 조건에 안맞으면 실행됩니다.
case가 길어도 짧아도 중괄호를 안쓰셔도 되는데, 쓸 수도 있습니다. 위의 case 30: 처럼요..
switch 문도 중첩이 가능합니다. 자주 쓰이진 않는 것 같습니다만.
public class FirstClass {
public static void main(String[] args) {
int a = 10;
switch(a){
case 10:
int b = 20:
switch(b){
case 30:
System.out.println("30");
break;
default:
System.out.println("30? 응 어림도 없지");
break;
}
System.out.println("10");
break;
case 20:
System.out.println("20");
break;
case 30: {
System.out.println("30");
break;
}
default:
System.out.println("응 다 틀렸어");
break;
}
}
}
구조가 보이시나요? a가 10이면 저 내부 switch문이 실행되게 됩니다.
오늘 내용은 여기까지고 이제 질문 받고 시간이 남으면 문제 풀이 들어갈게요!
'멘토링 준비 자료 > 자바 스터디 멘토링' 카테고리의 다른 글
자바 스터디 3주차 - 클래스와 객체 (0) | 2022.03.26 |
---|---|
자바 스터디 2주차 - 반복문과 배열, 예외처리 (0) | 2022.03.21 |
자바 스터디 1주차 - 자바 기본 프로그래밍_1 (0) | 2022.03.10 |
자바 스터디 1주차 - 자바 개요 (0) | 2022.03.09 |
자바 스터디 1주차 - 프로젝트 생성 (0) | 2022.03.09 |