별찍기 하는 이유 : 제어문( for, if ) 연습에 좋다.
실전에서는 안쓰지만 '에라토스테네스의 체' 할 때 도움이 됨
별 출력하기
https://codeup.kr/problem.php?id=1256
구구단을 별로 출력하기
https://codeup.kr/problem.php?id=1287
별 계단 만들기
https://codeup.kr/problem.php?id=1361
평행사변형 출력하기 1
https://codeup.kr/problem.php?id=1367
직각 삼각형 출력하기
https://school.programmers.co.kr/learn/courses/30/lessons/120823
피라미드 출력하기
문자열을 반복하는 메소드 중 하나로, for문의 복잡함을 줄여주는 유용한 기능을 가지고 있다. (Java 11 부터 추가)
String str = "abc ";
System.out.println(str.repeat(6));
/*
결과
abc abc abc abc abc abc
*/
파라미터 위치에 음수일 경우 'IllegalArgumentException' 발생
파라미터를 지나치게 크게 준 경우 'OutOfMemoryError' 발생
대용량 데이터 처리에 유용하다.
public class StairsStar {
public static void main(String[] args) throws IOException {
int height = 5;
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
for (int i = 0; i < height; i++) {
for (int j = 0; j < i; j++) bw.append(" ");
bw.append("**\n");
}
bw.flush();
bw.close();
}
}
클래스는 상태와 동작(기능)을 가지고 있는데 상태에 해당 하는 것이
'멤버변수'이고, '동작'에 해당하는 것이 메소드이다.
메소드를 만들지 않고는 복잡한 기능을 만들 수 없을 뿐더러 개발의 시간소요가 많이 되기 때문이다.
Shift + Enter
클래스, Test클래스를 한눈에 보기
SpaceInvaders 클래스는 main method가 없기 때문에 실행할 수 없다.
멤버변수와 메소드는 이름 뒤에 괄호의 유무로 구별 할 수 있다.
SpaceInvaders si = new SpaceInvaders();
// 마치 몬스터볼에 있는 포켓몬을 꺼내야만 사용이 가능한 것과 비슷하다.
Alt + Enter → Create Test
public class User {
String name;
String phoneNumber; // 010~ -> 0 안나옴
int age;
// 멤버 변수 3개
boolean isAdult() { // isAdult 메소드 1개
return age >= 18;
}
}
class UserTest {
public static void main(String[] args) {
User user1 = new User(); // 객체1 생성
user1.name = "김미미";
user1.age = 14;
User user2 = new User(); // 객체2 생성
user2.name = "김나나";
user2.age = 37;
System.out.printf("%s는 어른인지? %b\n", user1.name, user1.isAdult());
System.out.printf("%s는 어른인지? %b\n", user2.name, user2.isAdult());
}
}
메소드 뿐 아니라 클래스와 변수에도 적용된다.
사용 가능 범위
항상 public 쓰면 안됨?
복잡한 개발 과정에서 접근제어자는 예측 가능성과 프로그램의 신뢰성을 높여주기 때문에 상황에 맞게 적용해 주어야한다.
변수명과 같이 메소드를 만들 때는 '무조건' 써야한다.
단순히 출력하고 메소드가 끝나는 경우엔 리턴타입이 필요없다.
그럴 때는 'void' 를 써준다. (변수 저장 불가능, 호출만 가능)
public class VariousReturnType {
public boolean isAdult() {
return true;
}
public int plus() {
return 1 + 1;
}
public User getUser() {
return new User();
}
public void printHello() {
System.out.println("Hello");
}
public static void main(String[] args) {
VariousReturnType vrt = new VariousReturnType();
boolean isAdult = vrt.isAdult();
int plusResult = vrt.plus();
User user = vrt.getUser();
vrt.printHello();
}
}
'동작'이기 때문에 '동사'로 자주 짓는다. + Camle Case
isAdult, getUser, printHello ...
public class Account {
int balance = 2000;
public boolean isSufficient() {
return balance >= 1500;
}
}
public class Payment {
public static void main(String[] args) {
Account account = new Account();
boolean isSufficient = account.isSufficient();
if (isSufficient) {
System.out.println("결제 처리 합니다.");
} else {
System.out.println("잔액이 부족합니다 재생.");
}
}
}
메소드를 선언 하면서 ( ) 안에 추가한다.
1. Calculator클래스가 Heap영역에 인스턴스로 생성 됩니다.
2. Static영역에 있는 main()메소드에서 calculator.printPlusOne(30)이 실행될 때
30을 전달 합니다.
3. 30은 printPlusOne(int num)으로 전달 됩니다.
4. .printPlusOne(int num)으로 전달된 30은 System.out.println(num + 1);로
전달됩니다.
5. 100이 2 ~ 4과정을 통해 실행됩니다.
6. 350이 2 ~ 4과정을 통해 실행 됩니다.
약수의 합을 구하는 메소드 만들기
public class MutsaMath {
// 약수의 합을 리턴하는 메소드
int sumOfFactors(int num) {
// num % i == 0 이면 약수
int answer = 1;
for (int i = 2; i <= num; i++) {
if (num % i == 0) answer += i;
}
return answer;
}
void printResult(int num) {
System.out.printf("%d의 약수의 합은 %d입니다.\n", num, sumOfFactors(num));
}
public static void main(String[] args) {
MutsaMath mutsaMath = new MutsaMath();
mutsaMath.printResult(12);
mutsaMath.printResult(36);
mutsaMath.printResult(48);
mutsaMath.printResult(29);
}
}
Codeup1671 가위바위보 메소드 만들기
public class RockPaperScissors {
// win, tie, lose
public String play(int user, int computer) { // 매개변수 2개, String 타입
// 0바위 1가위 2보
if (user == 0 && computer == 1) {
return "win";
} else if (user == 1 && computer == 2) {
return "win";
} else if (user == 2 && computer == 0) {
return "win";
} else if (user == computer) {
return "tie";
} else {
return "lose";
}
}
public static void main(String[] args) {
RockPaperScissors rpc = new RockPaperScissors();
System.out.println(rpc.play(0, 1)); // win
System.out.println(rpc.play(2, 2)); // tie
System.out.println(rpc.play(2, 1)); // lose
}
}
구성요소
main( ) → Static영역
new 한 Class → Heap영역
입력된 값들을 문자열 형태의 배열[ ]에 넣어주는 것이 역할이다.
프로그램 실행 시 설정값들을 넘길 때 주로 사용된다.
import java.util.Arrays;
public class ArgsPrinter {
public static void main(String[] args) {
System.out.println(Arrays.toString(args));
} // [] 가 출력된다.
}
‘Program arugments’ 에 전달할 값을 입력할 수 있다.
[ ] 안에 Hello 가 출력된다.
x 사이의 개수 구하기
https://school.programmers.co.kr/learn/courses/30/lessons/181867
class Solution {
public int[] solution(String myString) {
String[] str = myString.split("x", -1);
int[] answer = new int[str.length];
for (int i = 0; i < str.length; i++) {
if (str[i] != "x") {
answer[i] = str[i].length();
}
}
return answer;
}
}
제한 시간안에 풀지는 못 했지만 정말 아쉽게 예제 문제만 맞고 다 틀렸다.
팀원끼리 코드를 서로 피드백 해보다가 태환님께서 알려주신 split의 limit 범위 실수로 틀린걸 깨닫고 10에서 -1로 수정했더니 바로 정답처리 받았다!!
별찍기 문제들은 반복문의 로직의 이해가 어려웠다. 별이 나오는 위치와 공백이 나오는 위치를 확실하게 이해하고 다시 풀어 봐야겠다.
repeat 함수를 처음 배웠다. 알아두면 유용하게 사용 할 수 있을 것 같다.
메소드를 공부하긴 했었지만 코드를 분리해서 작성하는게 아직 익숙하지가 않아서 낯설게 느껴진다.
굳이 이렇게 해야하나? 싶지만 쓰는 이유가 확실하기 때문에 쓰겠지
지금은 느낄 수 없지만 언젠가 메소드가 익숙할 그 날을 기다리며 연습을 많이 해야겠다.
회고팀에서 문제 하나를 고른 다음 30분 ~ 1시간 가량 풀이하고 피드백 시간을 가지는데 오늘의 첫 문제는 프로그래머스의 x 사이의 개수 구하는 문제였다.
솔직히 최근에 멘탈이 많이 상해서 조금만 어렵다 싶으면 시도조차 해보기 싫었는데 오늘 한 번 풀어보자 다짐하고 집중해서 풀어 보았다. 아쉽게 모르는 실수 하나 차이로 틀렸지만 덕분에 모르는걸 알게 되는 너무나도 값진 시간이었다.
아주 만족스러웠다. 우리팀 짱!!!