[TIL] 230623 (클래스 생성, 코딩테스트: 문자열 계산하기)

CountryGirl·2023년 6월 23일
0

TIL

목록 보기
7/80

📌 클래스 생성

나는 블로그에 싹 정리를 하였지만...
내 머리에 온전히 들어온 건 별로 없었다...
그래서 클래스를 생성하는 것도 확실하게 몰랐다.

문제푸는 것은 너무 좋지만 자바 파일을 왔다갔다하면서 사용하는법은 모른다.

일단 클래스를 생성하는 법을 확실히 알아야했다.

클래스 만들기

접근제어자 class 클래스명 {...}
(접근제어자가 없을 경우 default)

class Book {
	...
}

클래스 멤버 (클래스 변수, 클래스 메서드)

: static 으로 선언하여 다른 곳에 객체 생성없이 바로 사용할 수 있다.

클래스 변수
static String publisher = "BESTBOOK"
클래스 메서드
static String setPublisher (String publisherName) {
	publisher = publisherName;
    return publisher;

인스턴스 멤버 (인스턴스 변수, 인스턴스 메서드)

: 객체 생성을 한 후, 사용할 수 있다.

인스턴스 변수
int pages = 1000;	// 클래스 안에
인스턴스 메서드
int getPages(int page) {
	pages = page;
    return pages;
}

생성자

: 이것이 있어야 객체를 호출(생성)할 수 있다.

  • 클래스 이름과 같아야하고 메서드 처럼 만든다.
class Book {
	String title;
    String contents;
    
public Book (String titleName, String content) {
	title = titleName;
    contents = content;
}

최소 객체를 생성할 때, titleName, content 를 매개변수로 넣어줘야 생성할 수 있다.

빈 생성자

public Book () {...}

빈 생성자는 생략할 수 있고 컴파일 시, 컴파일러가 자동으로 생성해준다.

this

자기 자신을 가르킨다.
변수명이 같을 때 헷갈리지 않기 위해 사용한다.

class Book {
	String title;
    String contents;
    
public Book (String title, String contents) {
	this.title = title;
    this.contents = contents;
}

색이 같은 각각 변수명들이 서로를 같은 변수이다.
this.title 는 클래스 내부에 있는 인스턴스 변수이고, public Book 안에 있는 String titletitle 은 객체를 생성할 때 들어오는 매개변수 title 이다.

나는 처음에 이런거조차도 헷갈렸다.....
이젠 안다.


📌 문자열 계산하기

문제점 & 시도 & 해결

문자열로 된 수식을 계산하여 int 로 return 하는 문제이다.
ex) String number = "3 + 4" ➡️ 7 (int)

지금까지 했던 문자열 계산이라면 연산자가 한 가지 종류인 것만 했다.
"3 + 34 + 9 + 10 + ... " 이런 문자열은 해보았다.

하지만 +, - 가 무작위로 나오는 문자열로 된 수식을 계산하여야했다.

머리로는 생각이 됐다.

  • 가 나오면 뒤에 오는 수를 넣어주고, - 가 나오면 뒤에 오는 수를 빼준다.....

하지만 코드로 어떻게 작성을 해야할 지 몰랐다...

System.out.println(3 + 4);

이렇게 하면 7이 출력이 된다.
자동으로 3과 4를 더해준다.

그래서 나는 문자열을 Integer.parseInt() 를 해주면 + 도 Integer 가 아니지만 Integer 로 인식하고 바로 계산을 해줄 것이라고 예상했다.

일단 문자열을 split()을 해서 문자열 배열로 바꾼 후, 하나하나 돌면서 하나씩 Integer.parseInt() 를 통해 Integer 로 변환을 해주었다.

for (int i = 0; i < stringSplit.length; i++) {
	answer = Integer.parseInt(stringSplit[i])
	}

이렇게 하게 되면 + 나 - 는 Integer 아니기 때문에 NumberFormatException 오류가 발생한다.

일단 +와 -를 나눠서 계산해야한다는 것은 안다.
그래서 향상된 switch문 통해서 구현을 하기로 했다.

문자열 배열의 인덱스의 짝수번째는 숫자가 오고 홀수번째는 연산자가 온다는 규칙을 알 수 있다.
그래서 아래와 같이 코드를 작성하였다.

int answer = 0;
for (int i = 0; i <= stringSplit.length / 2; i++) {
	switch (stringSplit[2 * i - 1]) {
		case "+" -> answer += Integer.parseInt(stringSplit[2 * i]);
		case "-" -> answer -= Integer.parseInt(stringSplit[2 * i]);
	}
}

하지만 i가 0부터 시작하면 switch (stringSplit[2 * i - 1]) 에서
ArrayIndexOutOfBoundsException 오류가 발생한다....

i 가 1 부터 시작하고 0 번째 수는 먼저 answer 에 넣어주기로 했다.

int answer = Integer.parseInt(my_split[0]);
for (int i = 1; i <= stringSplit.length / 2; i++) {
	switch (stringSplit[2 * i - 1]) {
		case "+" -> answer += Integer.parseInt(stringSplit[2 * i]);
		case "-" -> answer -= Integer.parseInt(stringSplit[2 * i]);
	}
}

이렇게 하니 오류가 발생하지 않았고, 정상적으로 출력이 되어 해결할 수 있었다.

profile
💻🌾시골소녀의 엉망징창 개발 성장일지🌾💻 (2023.05.23 ~)

0개의 댓글