It's going to be one day 🍀

안녕하세요! 매일 매일 공부하려고 노력하는 백엔드 개발자 지망생의 공부 흔적입니다.

Back-End/Java # 교육

[Java 교육] 변수/문자열

2jin2 2024. 1. 26. 17:52

[공부 내용 정리]

변수

변수의 선언과 저장

int age = 20;
double pi = 3.14
  • 변수의 이름을 지정할 때 예약어를 피해서 지정해야함.

변수 값 읽기

  • 변수는 초기화되어야 읽을 수 있음.

변수의 사용 범위

  • 중괄호 {} 블록 내에서 선언되고 사용됨.

<메소드 블록 안에 있는 변수는 선언된 블록 내에서만 가능>

  • 로컬 변수 : 메소드 블록 내에서 선언된 변수

클래스 or 변수 네이밍 규칙

  • 숫자x, 예약어x, 대소문자 구분, 길이제한x

변수 네이밍 컨벤션

  • 클래스명 첫 글자는 항상 대문자
  • 여러 단어가 합쳐진 변수명은 단어의 시작은 대문자
    • ex) saveMembers, lastIndexOf
  • 상수의 이름은 대문자가 권장사항
    • MIN_NUMBER, LAST_NAME

변수의 타입

  • 기본 타입 (원시 : primitive type)
  • 정수 타입 (byte, char, short, int, long)
    • byte (1byte) < char (2byte) < short (2byte) < int (4byte) < long (8byte)
  • 실수 타입 (float, double)
    • float (4byte) < double (8byte)
    • 자바는 실수 연산 기본 타입으로 double을 사용함. float 사용시 값 뒤에 f 또는 F 붙여야 함.
  • 논리 타입 (boolean)
    • 논리값 (true/false) 저장

타입 변환

  • 데이터 타입을 다른 데이터 타입으로 변환하는 것

1) 자동 (묵시적) 타입 변환

  • 작은 크기의 타입은 큰 크기의 타입으로 자동 타입 변환 가능
int intValue = 500;
long longValue = intValue // 타입 변환 (int -> long)

 

2) 강제적 (명시적) 타입 변환

  • 반대로 큰 크기의 타입은 작은 크기의 타입으로 자동 타입 변환 할 수 없음.
  • 하지만 캐스팅(쪼개서)하여 강제로 타입을 변환시킬 수 있음.
double doubleValue = 3.14;
int intValue = (int) doubleValue;   // intValue는 정수 부분인 3만 저장

 

3) 연산식에서의 자동 타입 변환

  • 연산은 기본적으로 같은 타입끼리 수행되기 때문에 서로 다른 타입일 경우 크기가 큰 타입으로 자동변환된 후 연산을 수행함.
  • 예를 들어 int + double 덧셈 연산 시 int→double 으로 자동 변환되고 연산 수행.
  • 만약 int 타입으로 연산을 해야한다면 double 타입을 int 타입으로 강제 변환.

기본 자료형과 참조 자료형

  • 문자열 선언할 때는 리터럴 표기 방식을 따르는 것이 좋음
  • String a = "123"; String b = "Hello World";

equals

  • 문자열을 비교할 때 == 대신 equals을 사용해야함

-> str과 str2는 값은 같지만 서로 다른 객체이다. == 은 2개의 자료형이 같은 객체인지(= 같은 주소값을 갖는지)를 판별할 때 사용하는 연산자이르모 false를 리턴한다.

 

indexOf

  • 문자열에서 특정 문자열이 시작되는 위치(인덱스값)을 리턴함.
String a = "Hello World!";
System.out.println(a.indexOf("!"));
11
  • 공백도 센다.
  • 만약 찾는 값이 없다면 -1을 리턴한다.
  • +) 배열의 경우에는 인덱스를 벗어났다는 에러가 뜬다.

 

contains

  • contains 메서드는 문자열에서 특정 문자열이 포함되어있는지 여부를 리턴함.
String a = "Hello World!";
System.out.println(a.contains("World"));

→ 포함되어있으면 true 출력

 

charAt

  • 문자열에서 특정 위치의 문자를 리턴.
String findChar = "What is your hobby";
System.out.println(findChar.charAt(5));
i

 

replaceAll

  • 문자열에서 특정 문자열을 다른 문자열로 바꿀 때 사용함.
String a = "Hello World!";
System.out.println(a.replaceAll("World", "Spring"));
Hello Spring!

+) 정규 표현식도 가능

 

subString

  • 문자열에서 특정 문자열을 뽑아낼 때 사용함.
String a = "Hello World!";
System.out.println(a.substring(3, 5));
lo
  • 시작위치 ≤ a < 끝위치 (지정한 끝위치는 포함안됨!)

toUpperCase

  • 문자열을 모두 대문자로 변경할 때 사용함.
  • 반대로 toLowerCase는 모두 소문자로 변경함.

spilt

  • 문자열을 특정한 구분자로 나누어 문자열 배열로 반환
String a = "a:b:c:d";
String[] result = a.split(":");  // result는 {"a", "b", "c", "d"}
  • 여기서 바로 result를 출력하면 주소값이 나옴. 따라서 for문을 사용하거나 메서드를 사용해야함

concat

  • 문자열을 합치는 역할을 하고, 결과값은 문자열로 반환함.
String result = "Hello";
System.out.println(result.concat("!"));   // 결과 : Hello!

문자열 포맷팅 메서드 - format

String.format("... **%s**.. **%s**..", 치환값1, 치환값2);

→ 첫 번째 s의 경우 치환값1, 두 번째 s의 경우 치환값2

String name1 = "Tim";
int age1 = 30;

String name2 = "Anna";
int age2 = 45;

String.format("%s의 나이는 %s세 입니다", name1, age1);
String.format("%s의 나이는 %s세 입니다", name2, age2);

혹은 직접 인자값을 넣어줌으로써 치환도 가능함!

String.format("%s의 나이는 %s세 입니다", "Tim", 30);
String.format("%s의 나이는 %s세 입니다", "Anna", 45);

+) 현업에서는 System.*out*.println(); 대신 LogBack 이라는 라이브러리로 로그를 관리함. (sout은 원하지 않는 로그가 출력되기 때문)

 

StringBuffer/StringBuilder

  • 문자열을 추가하거나 변경할 때(연산) 주로 사용하는 자료형.
public class StringBuilderBufferExample {
    public static void main(String[] args) {
        StringBuilder builder = new StringBuilder();
        builder.append("Hello ");
        builder.append("Java ");
        builder.append("World!");
        System.out.println(builder);

        StringBuffer buffer = new StringBuffer();
        buffer.append("Hello ");
        buffer.append("Java ");
        buffer.append("World!");
        System.out.println(buffer);
    }
}

오토박 & 언박싱, 문자열과 숫자형 변환

  • 기본형(Primitive) 타입과 이것의 Wrapper 타입(클래스)
    • Wrapper은 기본 자료형을 감싸 객체 형태로 만든 것

 

오토박싱

  • 기본 타입의 데이터를 Wrapper 클래스의 객체로 변환하는 것
int index = 11;
        Integer number = Integer.valueOf(index); // 박싱
int index = 11;
Integer number = index;   // 오토박싱
  • 오토박싱은 제네릭 컬렉션에 값을 추가하는 경우 유용함.
public class AutoBoxingExample {
	  public static void main(String args[]) {
				ArrayList<Integer> arrayList = new ArrayList<>();
				
				/* 오토 박싱 */
				arrayList.add(10);
				arrayList.add(20);
				arrayList.add(30);
				
				System.out.println("ArrayList: " + arrayList);
		}
} 
  • 오토박싱으로 기본타입의 값은 Wrapper클래스의 객체로 변환되어 Integer 타입의 ArrayList에 할당됨.
  • 그리고 null 값을 허용함

언박싱

  • 래퍼 클래스를 기본형 타입으로 변환하는 것
int index = 20;
Integer intObject = index;   // 오토박싱

int index = intObject;    // 언박싱

+) 오토박싱이 수행되면 연산 시간이 더 늘어나게 됨. 따라서 오토박싱과 언박싱이 이루어지지 않도록 동일한 타입연산이 이루어지도록 구현해야함.


문자열과 숫자 형변환

String → int/Integer

String str = "12345";
int intValue = Integer.parseInt(str);
Integer integerValue = Integer.valueOf(str);

System.out.println(intValue);
System.out.println(integerValue);

→ 이렇게 str에 숫자로 입력된 문자열 값이 들어가면 잘 실행됨. 하지만 str에 숫자가 아닌 문자열이 입력되고 숫자 타입으로 파싱하려 NumberFormatException  에러 발생.

 

String → Long

  • Long.parseLong()
String str = "10000000000";             // 100억 숫자값으로 입력
long strTolong = Long.parseLong(str);
Long strToLong = Long.valueOf(str);    // Wrapper class로 변환

System.out.println(strToLong);

 

<실행 결과>

10000000000

 

String → Float/Double

  • Float.parseFloat()
  • Double.parseDouble()
String str = "1000000.985";          
Double strToDouble = Double.parseDouble(str);
Float strToFloat = Float.parseFloat(str);

System.out.println(strToFloat);
System.out.println(strToDouble);

 

<실행 결과>

1000001.0
1000000.985