자바 재귀메서드, 재귀함수 (사용법, 예시, 개념)
자바 프로그래머스에서 열심히 코딩 공부를 하던 중, 재귀함수가 사용된 것을 처음 보았다. 재귀함수는 자기 함수에서 자기 자신을 호출하는 함수를 말하는 것으로, 반복적인 연산 처리에 특히 유용하게 사용되는 재귀함수에 대해 알아보았다. 재귀메서드, 재귀함수 개념 재귀메서드, 재귀함수는 함수가 자기 자신을 호출하는 것을 말함. 일반적 구조 public int 메서드명(입력값) { if (종료조건) { // 종료 조건 만족하면 종료 return 기본값; } return 재귀함수(조정된 입력값); // 자기자신 호출 } 재귀함수는 함수 내에서 자신을 호출하고, 호출할 때마다 입력값을 조정하여 종료조건을 만족할 때까지 자신을 호출하도록 설계된다. 재귀함수 동작 원리 재귀 함수는 스택 자료구조를 통해 동작함 각각의 ..
2024.04.11
자바 replace, replaceAll 차이점
자바 문제를 풀 때, 문자값을 변경할 때 사용하는 대표적인 메서드가 바로 replace와 replaceAll이다. 주의깊게 생각하지 않고 값 변경 시 replace, replaceAll 모두 사용하다가, 둘 다 사용 시 결과값이 비슷하여 문득 차이가 무엇인지 궁금해졌다. replace()와 replaceAll() 사용법 둘 다 원하는 문자값을 다른 문자값으로 대체하는 기능을 한다. 메서드 사용법은 아래와 같다. String.replace(CharSequence target, CharSequence replacement) String.replaceAll(String regex, String replacement) 해당 문자열에서 바꾸고자 하는 문자나 문자열과 일치하는 모든 부분을 수정해준다. String ..
2024.04.04
no image
자바 삼항연산자 사용법
삼항연산자란 if조건문과 유사한 기능을 하는 연산자로, 코드를 간결하게 표현할 수 있다는 장점이 있음 그러나 복잡한 로직 속에서는 오히려 가독성을 해칠 수 있으므로 유의해야함. 자바 삼항연산자 구조 조건문이 참일 경우 표현식1이 실행되고, 거짓일 경우 표현식2가 실행된다. 사용 예시 [프로그래머스 문제] 자연수 n이 입력으로 주어졌을 때 만약 n이 짝수이면 "n is even"을, 홀수이면 "n is odd"를 출력하는 코드를 작성 - 삼항연산자 사용 import java.util.Scanner; public class Solution { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.next..
2024.03.31
자바 String 클래스 메서드 정리
String 클래스란? Java에서 문자열과 관련된 유틸리티 메서드를 모아둔 클래스 String 클래스 메서드 종류 charAt(인덱스): 해당 인덱스에 있는 문자를 반환 length(): 문자열의 길이를 반환 substring(시작인덱스, 끝인덱스): 시작인덱스부터 끝인덱스 직전까지 문자열 반환, 끝인덱스 생략 시 끝까지 반환 equals(객체): 주어진 객체와 문자열이 같은지 비교(true/false) indexOf(정수or문자): 문자열에서 해당 문자가 어느 위치에 있는지 인덱스값 반환(없을 경우 -1 반환) contains(문자열): 해당 문자열이 포함되어 있는지 확인(true/false) toLowerCase() / toUpperCase(): 문자열을 소문자/ 대문자로 변환 trim(): 문자열..
2024.03.30
no image
자바 Character 클래스 : 소문자 혹은 대문자로 변경하는 메서드?
Character 클래스란? Character 클래스는 Java에서 문자값과 관련된 유틸리티 메서드를 모아둔 클래스 Character 클래스 메서드 종류 isUpperCase(ch) : 문자 ch 값이 대문자인지 확인(true/false) isLowerCase(ch) : 문자 ch 값이 소문자인지 확인(true/false) isLetter(ch) : 문자 ch 값이 문자인지 확인(true/false) isDigit(ch) : 문자 ch 값이 숫자인지 확인(true/false) isWhitespace(ch) : 문자 ch 값이 공백인지 확인(true/false) isDefined(ch) : 문자 ch가 유니코드인지 확인(true/false) toUpperCase(ch) : 문자 ch 값을 대문자로 변환하여..
2024.03.26
no image
자바 나눗셈 소수점 자리까지 나타내는 방법
백준이나 프로그래머스 등 자바 프로그래밍 관련 문제를 풀 때, 초보자라면 궁금증한 것 중 하나가 바로 나눗셈 소수점 자리까지 값을 얻는 방법에 관한 것이다. 예를들어, 1 / 3 = 0.333333 의 값을 출력하고 싶은데, 자연스럽게 아래의 코드를 입력하면 출력값은 0.0이 나올 뿐이다. int a = 1; int b = 3; double result = a / b; System.out.println(result); // 출력: 0.0 이렇게, result만 실수 타입으로 선언하면 소수점까지 쫙 나올 줄 알았는데, 출력은 0.0 으로 나온다. 결론적으로, 결과가 소수점까지 나오도록 하기 위해서는, 나누어주는 변수 a, b 둘 중 하나라도 실수형 타입이어야만 결과값이 소수점까지 표현이 된다. 따라서 아래..
2024.03.21
자바 제어문 정리 (if문, switch문, while문, for문)
※ 비교연산자 a = b : a와 b가 같다 a != b : a와 b는 같지 않다 ※ and, or, not 연산자 a && b : a, b 모두 참이어야 참 (and) a || b : a, b 중 하나만 참이어도 참 (or) !a : a가 거짓이면 참 (not) ※ break;와 continue; break: 해당 제어문 자체를 빠져나감 (제어문 끝, 다음 문장 수행) continue: 해당 제어문의 조건문으로 돌아감 (제어문 내의 조건문으로 즉, 제어문 처음부터 다시 수행) ■ If 문: 구조 : If - else if - else If (조건문) { ; ; .... } else if (조건문) { ; ; .... } else if (조건문) { ; ; .... } else { ; ; .... } ■..
2024.03.20
자바 자료형 정리(다시 정리)
※ 변수명 짓는 규칙 숫자로 시작 불가 특수문자는 _ & 만 가능 int, class, return 등 키워드는 변수명으로 사용 불가 카멜 케이스 ex) getBackGround ※ 클래스명 짓는 규칙 명사로 할 것 대문자로 시작 파스칼케이스 ex) ChocoCookie ※ 메서드명짓는 규칙 동사로 할 것 소문자로 시작 카멜 케이스 ex) getBackGround ■ 원시 자료형(Primitive type) 과 참조 자료형(Reference type): 원시자료형 : 변수에 실제 값을 가지는 자료형 참조자료형 : 실제 값을 갖는 것이 아닌 데이터가 저장된 메모리의 주소 값을 가지는 자료형 구 분 자료형명 자 료 형 특 징 사 용 예 시 원시 자료형 int 정수형 -2147483648 ~ 214748364..
2024.03.17
자바 프로그램 만들기 : 자릿수 구하기
만들 프로그램 양의 정수를 입력받고, 입력받은 수의 자릿수를 출력 내가 작성한 코드 메서드명 : getCount 입력받는 값은 양의 정수(a) 출력하는 값은 숫자 개수 처음엔 10 미만일 경우 1자리, 100 미만일 경우 2자리...로 생각하였으나, 무한한 자릿수를 나타낼 수 없어 문자열로 변환하고 글자수를 세는 방법을 생각하게 됨 public class Problem3 { static int getCount(int a) { String result = "" + a; return result.length(); } public static void main(String[] args) { System.out.println("자릿수: "+getCount(3)); System.out.println("자릿수: "..
2024.03.15
자바 프로그램 만들기 : 게시판 페이징
만들 프로그램 게시물의 총 개수와 한 페이지에 보여 줄 게시물 수를 입력했을 때 총 페이지 수를 출력하는 프로그램 내가 작성한 코드 import java.util.Scanner; public class Problem2 { static int getTotalPage(int m, int n) { int result = 0; if (m % n == 0) { result = m / n; } else if(m % n != 0) { result = (m / n) + 1; } return result; } public static void main(String[] args) { Scanner sc1 = new Scanner(System.in); Scanner sc2 = new Scanner(System.in); Sy..
2024.03.13

 

자바 프로그래머스에서 열심히 코딩 공부를 하던 중,

 

재귀함수가 사용된 것을 처음 보았다.

 

재귀함수는 자기 함수에서 자기 자신을 호출하는 함수를 말하는 것으로,

 

반복적인 연산 처리에 특히 유용하게 사용되는

 

재귀함수에 대해 알아보았다.

 

 

 

 

 

 

 

 

 

재귀메서드, 재귀함수 개념

재귀메서드, 재귀함수는 함수가 자기 자신을 호출하는 것을 말함.

 

  • 일반적 구조
public int 메서드명(입력값) {

    if (종료조건) {              // 종료 조건 만족하면 종료
        return 기본값;
    }

    return 재귀함수(조정된 입력값);       // 자기자신 호출
}

 

재귀함수는 함수 내에서 자신을 호출하고,

 

호출할 때마다 입력값을 조정하여

 

종료조건을 만족할 때까지 자신을 호출하도록 설계된다.

 

 

 

 

 

재귀함수 동작 원리

재귀 함수는 스택 자료구조를 통해 동작함

 

각각의 재귀 호출은 스택 프레임에 쌓이고,

 

함수가 종료되면 해당 스택 프레임 제거

 

최종적으로 최하위 호출부터 차례대로 결과를 반환한다.

 

 

재귀함수 예시

<팩토리얼 구하는 메서드 작성>

public int factorial(int n) {
    if (n == 0 || n == 1) {       // 종료 조건
        return 1;
    }
    
    return n * factorial(n - 1);     // 자기 자신 호출
}

 

<제곱  구하는 메서드 작성>

    private int pow(int base, int exponent) {       // 종료 조건
        if(exponen == 0) return 1;

        return base * pow(base, exponent - 1);     // 자기 자신 호출
    }

 

 

 

 

 

재귀함수 장단점

장점

  • 간단하고 간결한 코드 작성 가능
  • 반복적인 문제를 효율적으로 해결할 수 있음
  • 문제를 하위 문제로 분할하여 해결할 수 있음

 


단점

  • 재귀 호출 시 스택 메모리를 사용하므로 메모리 부하 발생 가능
  • 종료 조건을 설정하지 않으면 무한 반복에 빠질 수 있음
  • 반복문보다 함수 호출에 추가적인 오버헤드가 발생할 수 있음

자바 replace, replaceAll 차이점

친환경 개발자
|2024. 4. 4. 17:25

 

 

자바 문제를 풀 때, 문자값을 변경할 때 사용하는 대표적인 메서드가

 

바로 replace와 replaceAll이다. 

 

주의깊게 생각하지 않고 값 변경 시 replace, replaceAll 모두 사용하다가,

 

둘 다 사용 시 결과값이 비슷하여  문득 차이가 무엇인지 궁금해졌다.

 

 

 

 

 

 

 

replace()와 replaceAll() 사용법

둘 다 원하는 문자값을 다른 문자값으로 대체하는 기능을 한다.

 

메서드 사용법은 아래와 같다.

 

  • String.replace(CharSequence target, CharSequence replacement)
  • String.replaceAll(String regex, String replacement)

 

해당 문자열에서 바꾸고자 하는 문자나 문자열과 일치하는 모든 부분을 수정해준다.

 

 

 

<예시>

String str = "apple banana apple orange apple";

// replace 메서드 사용
String replacedStr = str.replace("apple", "grape");
System.out.println("replace 사용: " + replacedStr); // 출력: grape banana grape orange grape

// replaceAll 메서드 사용
String replacedAllStr = str.replaceAll("apple", "grape");
System.out.println("replaceAll 사용: " + replacedAllStr); // 출력: grape banana grape orange grape

 

 

 

 

 

 

replace, replaceAll 차이점

두 메서드 모두 특정 문자열 모두를 원하는 문자열로 변경한다.

 

그러나 입력하는 입력값의 형태가 엄연히 다르다.

 

 

 

replace에서는 단순 문자 혹은 문자 모음을 입력하며,

 

replaceAll에서는 String regex, 즉 정규표현식을 활용하여 활용 범위가 더 넓다고 할 수 있다.

 

 

 

예를 들어, 문자열의 여러 문자를 한 번에 하나의 문자로 대체하고자 하는 경우,

 

replace 메서드를 사용하면 상당히 번거로운데,

 

이 때 replaceAll 메서드로 정규표현식을 활용하여 쉽게 처리할 수 있다.

 

 

<예시>

public class ReplaceExample {
    public static void main(String[] args) {
        String originalString = "Hello! How are you? 123.";

        // 정규 표현식을 사용하여 모든 비알파벳 문자를 제거하는 replaceAll 사용
        String cleanedString = originalString.replaceAll("[^a-zA-Z0-9]", "");

        System.out.println(originalString);    //출력: Hello! How are you? 123.
        System.out.println(cleanedString);   //출력: HelloHowareyou123
    }
}
  • 정규 표현식 [^a-zA-Z0-9]은 소문자 (a-z), 대문자 (A-Z), 숫자 (0-9)가 아닌 문자를 모두 일치시킴
    (^는 문자 클래스 안에서 부정(not)을 의미).

 

 

그렇다고 무조건 replace 메서드 대신 replaceAll 메서드만 사용하는 것은 좋지 않다.

 

replaceAll 메서드의 경우 구현 과정에서 인스턴스를 생성하여

 

replace 메서드에 비해 성능이 떨어질 수 있기 때문이다. 

자바 삼항연산자 사용법

친환경 개발자
|2024. 3. 31. 23:14

삼항연산자란

if조건문과 유사한 기능을 하는 연산자로, 코드를 간결하게 표현할 수 있다는 장점이 있음

그러나 복잡한 로직 속에서는 오히려 가독성을 해칠 수 있으므로 유의해야함.

 

 

 

자바 삼항연산자 구조

 

 

 

조건문이 참일 경우 표현식1이 실행되고, 거짓일 경우 표현식2가 실행된다.

 

 

 

 

사용 예시

[프로그래머스 문제]

자연수 n이 입력으로 주어졌을 때 만약 n이 짝수이면 "n is even"을, 홀수이면 "n is odd"를 출력하는 코드를 작성

 

 

<모범 답안> - 삼항연산자 사용

import java.util.Scanner;

public class Solution {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();

        System.out.print(n + " is "+(n % 2 == 0 ? "even" : "odd"));
    }
}

 

 

 

<내 답안> - IF문 사용

import java.util.Scanner;

public class Solution {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        
        if (n%2 == 0) {
            System.out.printf("%d is even", n);
        } else if (n%2 == 1) {
          System.out.printf("%d is odd", n);  
        }
    }
}

IF문으로 길게 써야하는 내용을 삼항연산자를 통해 한줄로 표현할 수 있다!

 

자바 String 클래스 메서드 정리

친환경 개발자
|2024. 3. 30. 16:10

String 클래스란?

Java에서 문자열과 관련된 유틸리티 메서드를 모아둔 클래스

 

 

 

 

 

String 클래스 메서드 종류

  1. charAt(인덱스): 해당 인덱스에 있는 문자를 반환
  2. length(): 문자열의 길이를 반환
  3. substring(시작인덱스, 끝인덱스): 시작인덱스부터 끝인덱스 직전까지 문자열 반환, 끝인덱스 생략 시 끝까지 반환
  4. equals(객체): 주어진 객체와 문자열이 같은지 비교(true/false)
  5. indexOf(정수or문자): 문자열에서 해당 문자가 어느 위치에 있는지 인덱스값 반환(없을 경우 -1 반환) 
  6. contains(문자열): 해당 문자열이 포함되어 있는지 확인(true/false)
  7. toLowerCase() / toUpperCase(): 문자열을 소문자/ 대문자로 변환
  8. trim(): 문자열의 앞뒤 공백을 제거
  9. split(구분자): 문자열을 해당 구분자로 나누어 배열로 저장
  10. concat(문자열): 문자열을 이어붙임
  11. replace(변경전,변경후): 해당 문자열을 다른 문자열로 수정
  12. startswith(문자열): 해당 문자열로 시작하는지 여부 확인

 

 

 

 

 

관련 문제

 

[프로그래머스 문제]

문자열 my_string, overwrite_string과 정수 s가 주어지고, 문자열 my_string의 인덱스 s부터 overwrite_string의 길이만큼을 문자열 overwrite_string으로 바꾼 문자열을 return 하는 solution 함수를 작성하라

 

 

<모범 답안>

class Solution {
    public String solution(String my_string, String overwrite_string, int s) {
        String before = my_string.substring(0, s);     // 변경할 부분 직전까지의 문자열 추출
        String after = my_string.substring(s + overwrite_string.length());    // 변경할 부분 이후의 문자열 추출
        return before + overwrite_string + after; 
    }
}

 

<내 답안>

class Solution {
    public String solution(String my_string, String overwrite_string, int s) {
        String t = my_string.substring(s, s + overwrite_string.length());
        String answer = my_string.replace(t, overwrite_string);
        return answer;
    }


변경전 문자열에서 바꿀 문자열만큼 추출해서 변경하는 건 수행되지만,
만약 my_string의 바꿀 내용이 반복된다면, 반복되는 부분 모두가 같이 변경되어버려
오답임

 

 

Character  클래스란?

 Character 클래스는 Java에서 문자값과 관련된 유틸리티 메서드를 모아둔 클래스

 

 

Character 클래스 메서드 종류

  • isUpperCase(ch) : 문자 ch 값이 대문자인지 확인(true/false)
  • isLowerCase(ch) : 문자 ch 값이 소문자인지 확인(true/false)
  • isLetter(ch)  : 문자 ch 값이 문자인지 확인(true/false)
  • isDigit(ch) : 문자 ch 값이 숫자인지 확인(true/false)
  • isWhitespace(ch) : 문자 ch 값이 공백인지 확인(true/false)
  • isDefined(ch) : 문자 ch가 유니코드인지 확인(true/false)
  • toUpperCase(ch) : 문자 ch 값을 대문자로 변환하여 반환
  • toLowerCase(ch) : 문자 ch 값을 소문자로 변환하여 반환

 

 

관련 문제

 

[프로그래머스 문제]

영어 알파벳으로 이루어진 문자열 입력받은 후, 소문자는 대문자로, 대문자는 소문자로 변환하여 출력

 

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String a = sc.next();

        StringBuffer result = new StringBuffer();   // 결과값 수정,추가를 위해 StringBuffer 선언

        for (int i=0; i<a.length(); i++) {
            char ch = a.charAt(i);     // ch 변수에 입력받은 문자를 한글자씩 불러옴
            if (Character.isUpperCase(ch)) {      // 대소문자 확인하여 변환
                result.append(Character.toLowerCase(ch));
            } else if (Character.isLowerCase(ch)) {
                result.append(Character.toUpperCase(ch));
            }
        }

        System.out.println(result);
    }
}

 

백준이나 프로그래머스 등 자바 프로그래밍 관련 문제를 풀 때,

 

초보자라면 궁금증한 것 중 하나가 바로

 

나눗셈 소수점 자리까지 값을 얻는 방법에 관한 것이다.

 

 

 

 

예를들어,

 

1 / 3 = 0.333333 의 값을 출력하고 싶은데,

 

자연스럽게 아래의 코드를 입력하면

 

출력값은 0.0이 나올 뿐이다.

 

int a = 1;
int b = 3;

double result = a / b;

System.out.println(result);  // 출력: 0.0

 

이렇게, 

 

result만 실수 타입으로 선언하면 소수점까지 쫙 나올 줄 알았는데,

 

출력은 0.0 으로 나온다.

 

 

 

 

결론적으로, 결과가 소수점까지 나오도록 하기 위해서는,

 

나누어주는 변수 a, b 둘 중 하나라도 실수형 타입이어야만

 

결과값이 소수점까지 표현이 된다.

 

 

따라서 아래와 같이 변경해주면 된다.

 

 

int a = 1;
double b = 3;

double result = a / b;

System.out.println(result);  // 출력: 0.3333333333333333

 

int a = 1;
int b = 3;

double result = (double) a / b;   // 정수 a를 실수형 타입으로 캐스팅(형 변환)

System.out.println(result);  // 출력: 0.3333333333333333 

 

 

 

 

 

 

그렇다면, a와 b를 실수형으로, result값을 정수형으로 선언하면 어떻게 될까?

 

자바 나눗셈 소수점까지 1

 

 

실수형끼리의 연산 시 기본적으로 실수형의 값이 반환되고,

 

실수형 값을 정수형 변수에 넣을 경우 캐스팅을 억지로 하지 않는 이상

 

위와 같은 에러가 발생한다!

 

※ 비교연산자

  • a = b : a와 b가 같다
  • a != b : a와 b는 같지 않다

 

※ and, or, not  연산자

  • a && b :  a, b 모두 참이어야 참    (and)
  •    a || b :  a, b 중 하나만 참이어도 참   (or)
  •         !a :  a가 거짓이면 참     (not)

 

※ break;와 continue;

  •  break: 해당 제어문 자체를 빠져나감 (제어문 끝, 다음 문장 수행)
  •  continue: 해당 제어문의 조건문으로 돌아감 (제어문 내의 조건문으로 즉, 제어문 처음부터 다시 수행)

 

■ If 문:

 

구조 : If - else if - else

 

 

If (조건문) {
    <수행할 문장 1>;
    <수행할 문장 2>;
    ....
} else if (조건문) {
    <수행할 문장 1>;
    <수행할 문장 2>;
    ....
} else if (조건문) {
    <수행할 문장 1>;
    <수행할 문장 2>;
    ....
} else {
    <수행할 문장 1>;
    <수행할 문장 2>;
    ....
}

 

 

■ switch / case 문:

 

입력 변수의 값이 해당 case의 입력값과 같으면 해당 문장을 수행한 뒤

break;문을 통해 switch문을 빠져나간다.

case 입력값 이외의 값에 해당할 경우에는 default: 문장을 수행함

 

switch (입력 변수) {
    case 입력값 1: <수행할 문장 1>;
        break;
    case 입력값 2: <수행할 문장 2>;
        break;


    ....


    default: <수행할 문장 n>;
        break;
}

 

■ while 문:

조건이 참인 동안 계속 수행됨

 

while (조건문) {
    <수행할 문장 1>;
    <수행할 문장 2>;
    ....
}

 

 

■ for 문:

초깃값을 넣고, 조건문이 참일 때까지 값을 증가시키며 문장 반복

 

기본 구조
for (초깃값; 조건문; 증갓값;) {           ex) (int i=0; i < 10; i++)     >> 정수 i값이 0부터 i<10이 참인 동안 문장 수행 후 i값 1씩 증가
    <수행할 문장 1>;
    <수행할 문장 2>;
    ....
}
for each문  >> 루프를 돌릴 수 있는 자료형(배열, 리스트 등)에서만 사용 가능
for (자료형 변수명 : 루프를 돌릴 객체 ) {          ex) (String a : numbers)     >> numbers라는 배열 혹은 리스트의 각 항목을
                                                                                                                          차례대로 a에 대입하여 수행

    <수행할 문장 1>;
    <수행할 문장 2>;
    ....
}

 

 

 print와 println 차이 :

  • print: 다음 출력 시 줄바꿈 없이 한 줄에 출력
  • println: 다음 출력 시 다음 줄로 넘어감

자바 자료형 정리(다시 정리)

친환경 개발자
|2024. 3. 17. 17:27

변수명 짓는 규칙

    1.  숫자로 시작 불가
    2.  특수문자는 _  &  만 가능
    3.  int, class, return 등 키워드는 변수명으로 사용 불가
    4.  카멜 케이스   ex) getBackGround

클래스명 짓는 규칙

  1.  명사로 할 것
  2.  대문자로 시작
  3.  파스칼케이스   ex) ChocoCookie

메서드짓는 규칙

  1.  동사로 할 것
  2.  소문자로 시작
  3.  카멜 케이스   ex) getBackGround

 

 

■ 원시 자료형(Primitive type) 과 참조 자료형(Reference type):

  • 원시자료형 : 변수에 실제 값을 가지는 자료형
  • 참조자료형 : 실제 값을 갖는 것이 아닌 데이터가 저장된 메모리의 주소 값을 가지는 자료형

 

      분 자료형명 자  료  형 특   징   용  예  시
원시
자료형
int 정수형 -2147483648 ~   2147483647 int a = 0;
long -9223372036854
 775808 ~
 9223372036854
 775807
long a = 123;
float 실수형 -3.4 *10^38 ~
 3.4*10^38
float a = 1.234;
double -1.7*10^308 ~
 1.7*10^308
double a = 1.234;
boolean True, False boolean a = true;
char 문자형 문자, 아스키코드, 유니코드 
(문자로 출력함)
char a = "d";
참조
자료형
String 문자열 원시자료형에
포함되지 않으나, 리터럴표기 가능
String a = "Geun";

자주 쓰는 메서드
- a.equals(b): a와 b가 같은지 (true/false)
- a.indexOf("문자열"): a에 특정 문자열이 시작되는 위치값 리턴
- a.contains("문자열): a에 특정 문자열이 포함되는지
- a.charAt(인덱스): 특정 인덱스에 위치한 문자 리턴
- a.replaceAll("문자열1","문자열2"): 문자열1을 문자열2로 바꿈
- a.substring(시작위치,끝위치): 해당위치의 문자값을 뽑아냄
- a.toUpperCase(): 모두 대문자로 변경
- a.split(":"): a의 문자들을 :로 나누어 문자열 배열로 리턴
StringBuffer 문자열 문자열 추가하거나 변경할 때 사용 StringBuffer sb = new StringBuffer();
sb.append("hello");     // sb에 문자열 추가
sb.append(" World");
String result = sb.toString();   // String 자료형으로 변경

 자주 쓰는 메서드
- sb.inesert(인덱스, "문자열"): 원하는위치에 특정문자열 삽입
- sb.substring(시작위치, 끝위치): 해당위치의 문자값 뽑아냄
type [] 배열 - 크기, 순서 O  String[], int[], float[]  ... = {1, 2, 3, 4, 5};

 자주 쓰는 메서드
a.length(): 배열의 길이 반
ArrayList 리스트 - 크기, 순서 X 
- 새로운 값 추가
  가능
 ArrayList<Integer> a = new ArrayList<>()  
 ArrayList<Integer> a = new ArrayList<>(Arrays.asList(1,23,326))   // 선언과 동시에 바로 값 넣을 수도 있음


 자주 쓰는 메서드
a.add(요솟값): 원하는 요솟값 추가
a.get(인덱스): 특정 인덱스 값 추출
a.size(): 요소의 개수 리턴
a.contains(요솟값): 특정 항목이 있는지 판별
a.remove(인덱스): 해당위치 항목 삭제, 그 요솟값 리턴
a.remove(객체): 해당 요솟값을 삭제, true/false리턴
String.join("구분자",리스트명): 해당 리스트에 구분자를 넣어
                                                             하나의 문자열로 만듦
a.sort(Comparator.naturalOrder()): 오름차순 정렬
                                       .reverseOrder()): 내림차순 정렬
HashMap key - value 쌍  HashMap<String, Integer> a = new HashMap<>()
                      key값   value자료형

 자주 쓰는 메서드
a.put(key값, value값): key와 value 추가
a.get(key값): key에 해당하는 value값 반환
a.getOrDefault(key값,얻을값): key에 해당하는 value값이 없을
                                                             때, null대신 얻을값을 반환
a.containsKey(key값): a에 해당 key 있는지 판별(true, false)
a.remove(key값): 해당 key의 항목을 삭제하고 value값 리턴
a.size(): a의 요소의 개수 리턴
a.keySet(): 모든 key값을 모아 집합 자료형으로 리턴
HashSet 집합 중복 X, 순서 X  HashSet a = new HashSet<>()

 

 

 

 

 

리터럴 표기란?

객체를 생성하지 않고 고정된 값을 그대로 대입하는 방식. 원시자료형에서 사용

    ex) String a = "Geun's blog"

          >> a라는 변수에 "Geun's blog"라는 문자열 값을 그대로 대입

 

 참조자료형에서는?

 new키워드를 사용하여 객체 만들어 사용. 객체 중심으로 코드 작성에 유리

    ex) String a = new String("Geun's blog")

          >> 항상 새로운 String 객체를 만든다.

 

 Wrapper 클래스

  원시자료형을 객체로 다루기 위해 객체화 시키는 클래스. 객체 지향 프로그래밍의 모든 기능을 활용할 수 있게 한다.

원시자료형 Wrapper 클래스
int Integer
long Long
double Double
float Float
boolean Boolean
char Char

 

 

형 변환

 (1) 문자열 → 정수 

       int n = Integer.parseInt(문자열)               

                 *정수 형태로 이루어진 문자열이어야 한다. (실수형태의 문자열은 정수형태로 변환 불가)

 

 (2) 정수 → 문자열

       String num = "" + (정수)                           *정수 앞에 빈 문자열("") 더하기

       String num = String.valueOf(정수)  

       String num = Integer.toString(정수)   

 

 (3) 실수 → 정수

       int n = (int) (실수)                                     *실수 앞에 (int) 붙임

만들 프로그램

 양의 정수를 입력받고, 입력받은 수의 자릿수를 출력

 

 

내가 작성한 코드

  • 메서드명 : getCount
  • 입력받는 값은 양의 정수(a)
  • 출력하는 값은 숫자 개수

 

처음엔 10 미만일 경우 1자리, 100 미만일 경우 2자리...로 생각하였으나,

무한한 자릿수를 나타낼 수 없어 문자열로 변환하고 글자수를 세는 방법을 생각하게 됨

 

public class Problem3 {

    static int getCount(int a) {
        String result = "" + a;
        return result.length();
    }

    public static void main(String[] args) {
        System.out.println("자릿수: "+getCount(3));
        System.out.println("자릿수: "+getCount(23));
        System.out.println("자릿수: "+getCount(2352));
        System.out.println("자릿수: "+getCount(462643));
    }
}

 

>> 출력:

자릿수: 1
자릿수: 2
자릿수: 4
자릿수: 6

 

 

모범 답안

1. 입력값을 몫이 0이 될때까지 10으로 나누고, 나눈 총횟수를 자릿수로서 리턴

public class Problem3_A {
    static int getDigitCount(int n) {
        int count = 1;
        while (true) {
            if (n == 0) {
                break;
            }
            n /= 10;     → 숫자 n을 10으로 나누고 그 값을 다시 숫자 n에 대입
            count++;
        }
        return count;
    }

    public static void main(String[] args) {
        System.out.println("자릿수: "+getDigitCount(3));
        System.out.println("자릿수: "+getDigitCount(23));
        System.out.println("자릿수: "+getDigitCount(2352));
        System.out.println("자릿수: "+getDigitCount(462643));
    }
}

 

>> 출력:

자릿수: 1
자릿수: 2
자릿수: 4
자릿수: 6

 

2. 10으로 나눴을 때 몫이 0이 될때까지 계속 나누고, 나눈 총횟수를 자릿수로서 리턴

public class Problem3_A {

    static int getDigitCount(int n) {
        String result = "" + n;    → 정수를 문자열로 변환
        return s.length();     → 문자열의 글자 수를 리턴
    }

    public static void main(String[] args) {
        System.out.println("자릿수: "+getCount(3));
        System.out.println("자릿수: "+getCount(23));
        System.out.println("자릿수: "+getCount(2352));
        System.out.println("자릿수: "+getCount(462643));
    }
}

 

>> 출력:

자릿수: 1
자릿수: 2
자릿수: 4
자릿수: 6

 

만들 프로그램

게시물의 총 개수한 페이지에 보여 줄 게시물 수입력했을 때 총 페이지 수출력하는 프로그램

 

 

내가 작성한 코드

import java.util.Scanner;

public class Problem2 {
    static int getTotalPage(int m, int n) {
        int result = 0;
        if (m % n == 0) {
            result = m / n;
        } else if(m % n != 0) {
            result = (m / n) + 1;
        }
        return result;
    }

    public static void main(String[] args) {
        Scanner sc1 = new Scanner(System.in);
        Scanner sc2 = new Scanner(System.in);

        System.out.print( "총 게시물 수 : ");
        int m = sc1.nextInt();
        System.out.print( "한 페이지에 보여줄 게시물 수 : ");
        int n = sc2.nextInt();

        System.out.print("총 페이지 수 : " + getTotalPage(m, n));
    }
}

 

>> 출력:

총 게시물 수 : 102
한 페이지에 보여줄 게시물 수 : 10
총 페이지 수 : 11

 

 

 

모범 답안

public class Problem2_A{
    static int getTotalPage(int m, int n) {     → static 메서드로 생성해야 객체 생성 없이 바로 해당 메서드 호출 가능
        if (m % n == 0) {
            return m / n;       → 굳이 result 변수 생성하지 않고 바로 결과값 반환
        } else {
            return m / n + 1;
        }
    }

    public static void main(String[] args) {
        System.out.println(getTotalPage(5, 10));
        System.out.println(getTotalPage(15, 10));
        System.out.println(getTotalPage(25, 10));
        System.out.println(getTotalPage(30, 10));
    }
}

 

>> 출력:

1

2

3

3