▶Math.ceil() : 올림 (실수형 유지)

Math.floor() : 내림 (실수형 유지)

Math.rint() : 반올림 (실수형 유지)

Math.round() : 반올림 (int형으로 반환)

System.out.println(Math.ceil(3.14));
System.out.println(Math.floor(3.14));
System.out.println(Math.rint(3.14));
System.out.println(Math.rint(3.51));
System.out.println(Math.round(3.51));
4.0
3.0
3.0
4.0
4

 

반응형

자바에서 String 하면 문자열이 떠오를 것이다.

String str1 = "Hello";

String str2 = " World";

라고 한다면 두개의 객체가 생성되어 각각 하나의 문자열을 가진다.

그리고 이 문자열을 더하는 행위를 했을 때, 또 다른 객체를 생성하여 받아야한다.

String str = str1+str2; //"Hello World" 이렇게 되는 것이다.

이러한 행위는 메모리 할당과 메모리 해제를 발생시키기 때문에 성능이 저하된다.

 

그래서 대안으로 StringBuilder 가 있는 것이다.

StringBuilder는 새로운 객체를 만들어 줄 필요 없이 하나의 객체에 기존의 문자열을 덧붙이는 방식을 사용하기 때문에 부하가 적으며 상대적으로 속도도 빠르다.

따라서 긴 문자열을 더하는 상황이 발생한다면 StringBuilder를 사용하면 효과적이다.

 

그러면 StringBuilder의 메소드를 살펴보면서 사용 방법을 소개하겠다.

 

append - 문자열 추가

StringBuilder sb = new StringBuilder();
sb.append("Hello").append(" World");
System.out.println(sb);
Hello World

 

delete - 문자열 제거

StringBuilder sb = new StringBuilder();
sb.append("Hello").append(" World");
System.out.println(sb);
		
sb.delete(2, 4); //2번자리에서 4번자리 전까지 (2,3번 자리 문자 제거)
System.out.println(sb);
Hello World
Heo World

 

 

deleteCharAt - 특정 문자만 제거

StringBuilder sb = new StringBuilder();
sb.append("Hello").append(" World");
System.out.println(sb);
		
sb.deleteCharAt(5);
System.out.println(sb);
Hello World
HelloWorld

 

setCharAt - 특정 위치 문자 변경

StringBuilder sb = new StringBuilder();
sb.append("Hello").append(" World");
System.out.println(sb);
		
sb.setCharAt(0, 't');
System.out.println(sb);
Hello World
tello World

 

insert - 문자열 삽입

StringBuilder sb = new StringBuilder();
sb.append("Hello").append(" World");
System.out.println(sb);
		
sb.insert(5, "!"); //매개변수로 받은 인덱스 위치부터 문자열 삽입
System.out.println(sb);
Hello World
Hello! World

 

reverse - 문자열 반전

StringBuilder sb = new StringBuilder();
sb.append("Hello").append(" World");
System.out.println(sb);
		
sb.reverse();
System.out.println(sb);
Hello World
dlroW olleH

 

setLength - 문자열 길이 조절

현재 문자열 길이보다 짧게 설정하면 그 길이 이외의 문자열은 제거됨

현재 문자열 길이보다 길게 설정하면 공백으로 채워짐

StringBuilder sb = new StringBuilder();
sb.append("Hello").append(" World");
System.out.println(sb);
		
sb.setLength(7);
System.out.println(sb);
Hello World
Hello W
반응형

자바에서 어떤 문자열을 저장하여 사용하고 싶을 때

String str = "abcdef";

와 같이 할 것이다. 원래는

String str = new String("abcdef"); 가 정확한 선언이지만 자바는 편의상 위의 문장처럼 선언하는 것을 허용하였다.

String이라는 클래스 이름으로 변수선언을 하였기에 str은 사실 참조변수가 되는 것이다.

 

그렇기 때문에 저 str이라는 객체 혹은 참조변수로 String클래스의 메소드를 사용할 수 있다.

이제 그 메소드들을 소개해보겠다.

 

isEmpty()

해당 변수가 비어있는지를 Boolean형으로 반환한다.

String a = "";
String b = "bbb";
System.out.println(a.isEmpty());
System.out.println(b.isEmpty());
true
false

 

equals()

두개의 문자열이 서로 같은지 true or false로 반환하는 메소드이다. 누군가는 이렇게 생각할 수 있다. "비교 연산자 ==를 사용하면 비교할 수 있잖아?" 다음의 예를 살펴보자

String aa = "world";
String bb = "world";
String cc = new String("world");

System.out.println(aa==bb);
System.out.println(bb==cc);
System.out.println(bb.equals(cc));
true
false
true

왜 이런 결과가 나온 것일까?

자바는 변수선언 형식의 String의 객체 생성을 통해 생성된 값(world)이 같으면 중복해서 주소를 생성하지 않는다.

그렇기 때문에 bb라는 객체를 생성할 때 이미 선언된 객체 aa의 값의 주소를 재활용하여 부여한 것이다.

 

하지만 new로 생성한다는 것은 무조건 다른 하나의 주소를 생성하라는 의미가 된다. world라는 같은 값이더라도 다른 주소를 생성하여 부여한다는 것이다.

 

따라서 aa, bb, cc의 값은 같지만 주소는 cc만 혼자 다른것이다.

따라서 ==는 주소까지 같아야 true를 반환하고 equals는 주소는 달라도 값이 같으면 true를 반환한다.

 

 

indexOf()

특정 문자가 처음 시작되는 인덱스 값을 int형으로 반환한다.

해당 문자가 존재하지 않으면 -1을 반환한다.

String a = "abcdefabcdef";
System.out.println(a.indexOf("c"));
System.out.println(a.indexOf("g"));
2
-1

 

substring(int beginindex, int endindex)

괄호 안에 들어가는 숫자 사이에 위치하는 문자를 반환한다.

예를 들어 str.substring(2, 5); 라고하면 str에 있는 문자열에서 2번째문자부터 5번째 전까지(2~4위치의 문자열) 잘라서 반환한다.

String str = "World";
System.out.println(str.substring(2, 4));
rl

 

toUpperCase()

toLowerCase()

toUpperCase()는 해당 문자열을 전부 대문자, toLowerCase()는 전부 소문자로 바꿔준다.

String str = "World";
System.out.println(str.toUpperCase());
System.out.println(str.toLowerCase());
WORLD
world

 

 

trim()

문자열 앞뒤에 있는 공백을 제거해준다.(중간은 제외)

String str = "    World";
System.out.println(str.trim());
World

 

charAt(int index)

해당 위치의 문자를 char형으로 반환한다.

String str = "World";
System.out.println(str.charAt(3));
l

 

valueOf()

괄호안의 값을 String형으로 즉, 문자열로 변환한다. 

int a = 123;
int b = 456;
System.out.println(String.valueOf(a)+String.valueOf(b));
123456 //문자열로 변환되었기 때문에 숫자로서가 아닌 문자열로서 더해져서 붙은 모습

 

toCharArray()

문자열을 한 글자씩 쪼개 char 배열로 반환한다.

String str = "World";
char[] arr = str.toCharArray();
System.out.println(arr);
System.out.println(Arrays.toString(arr));
World
[W, o, r, l, d]

//Arrays.toString() -> 배열의 내용을 출력할 수 있다.

 

getBytes()

byte 배열로 반환한다.

String str = "World";
byte[] arr = str.getBytes();
System.out.println(Arrays.toString(arr));
[87, 111, 114, 108, 100]

 

split(String regex)

문자열을 파라미터 기준으로 찢어 String 형 배열로 반환한다.

String str = "Hello/World/abc";
String[] arr = str.split("/");
System.out.println(Arrays.toString(arr));
[Hello, World, abc]

 

equalsIgnoreCase()

문자열이 대문자, 소문자 구분없이 같은 문자열인지 확인

String str1 = "World";
String str2 = "world";
		
System.out.println(str1.equalsIgnoreCase(str2));
true
반응형

실수의 연산은 오차가 따른다. 예를 들어 보자.

System.out.println(1.6+0.1);

1.6+0.1을 자바 이클립스에서 실행 할때 몇이 나올 것 같은가? 1.7? 아니다.

1.7000000000000002

정확한 1.7이 나오지 않고 소수점 뒤에 작은 오차가 발생한다. 컴퓨터는 실수를 표현할 때 부동소수점 방식을 사용하기 때문이다.

하지만 걱정하지마라 자바에는 이를 해결해줄 클래스가 존재한다. 바로 BigDecimal이라는 클래스이다.

이는 java.math패키지에 존재하기 때문에 import선언을 해줘야한다.

이제 BigDecimal 클래스를 사용해보자

import java.math.BigDecimal;

public class Main {

	public static void main(String[] args) {
		BigDecimal e1 = new BigDecimal("1.6"); // 객체생성 후 데이터입력 시 ""를 사용하여 문자열의 형태로 입력
		BigDecimal e2 = new BigDecimal("0.1");
		System.out.println(e1.add(e2));        //덧셈
		System.out.println(e1.subtract(e2));   //뺄셈
		System.out.println(e1.multiply(e2));   //곱셈
		System.out.println(e1.remainder(e2));  //나눗셈
	}
}
1.7
1.5
0.16
0.0

 

반응형

제목과 같이 숫자를 문자로 형변환 해주는 메소드 이다.

 

정수형은 integer.toString()

실수형은 Double.toString() 의 형태로 사용할 수 있다.

 

public static void main(String[] args) {
		int a = 2;
		int b = 2;
		System.out.println(a+b);
		System.out.println(Integer.toString(a)+b);
	}
4
22

 

출력란을 보면 첫번째 출력은 숫자 2와2를 더한 4가 나온것을 확인할 수 있고 두번째는 22로 되어있는데 이는 숫자 22가 아니라 문자"2"와 숫자 2가 붙어있는 모습이다. a를 문자열로 형변환 해주었기 때문이다.

 

 

 

 

 

 

 

 

 

반응형

Math.max, Math.min 은 Math클래스 소속 메소드이며 숫자 두개의 크기를 비교할 때 사용할 수 있다.

Math.max는 둘 중 큰값을, Math.min은 둘 중 작은 값을 반환한다.

 

System.out.println(Math.max(5, 10));
System.out.println(Math.min(5, 10));	
10
5

 

반응형

먼저 Random클래스를 살펴보자. 범위를 설정하면 범위 안의 난수를 뽑아내는 클래스이다.

활용 예제는 아래와 같다.

 

import java.util.Random;
public class Random2 {

	public static void main(String[] args) {
		Random ran = new Random();
		int num1 = ran.nextInt(100);
		double num2 = ran.nextDouble();
		System.out.println(num1);
		System.out.println(num2);
	}
}

 

이 클래스는 java.util 패키지에 속해있다. 따라서 import java.util.Random; 와 같이 import 선언을 해주어야한다. 

그리고 Random클래스를 활용하기 위한 객체를 생성(Random ran = new Random();) 해야한다.

int num = ran.nextInt(100); 는 0이상 100미만의 난수를 발생시켜 num1이라는 변수에 넣어줌을 의미하고

double num2 = ran.nextDouble(); 은 0이상1이하의 실수인 난수를 발생시켜 num2에 넣어준 것이다.

 

19
0.0581622972070579

 

그 결과 위와 같이 출력되었다.

 


 

그럼 이제 Math.random() 메소드를 살펴보자.

Math클래스는 수학관련 함수를 제공해주는 클래스로 java.lang패키지에 속해있기 때문에 따로 import를 안해줘도 된다. 그리고 모든 필드와 메소드가 static으로 선언되어 있기 때문에 객체를 생성하여 접근하지 않아도 된다. 그리고 Math.random() 메소드는 0이상 1이하의 난수만 발생시킨다는 것에 주의해야한다. 아래 예를 보자.

 

public class Random2 {

	public static void main(String[] args) {
		double num = Math.random();
		System.out.println(num);
	}
}

 

num이라는 변수에 Math.random()을 통해 난수를 넣었다.

뽑은 결과는 아래와 같다.

 

0.5962121869771372

 

 


 

 

둘 중 어느 것을 쓸 것인지는 개인의 취향에 따라 선택하면 될 것이다.

필자라면 Math.random() 을 사용할 것 같다. 그 이유는 객체 생성이 필요없고 0부터1사이의 실수인 난수라고 해도 곱셈연산으로 충분이 정수인 난수를 뽑아낼 수 있기 때문이다.

 

 

반응형

BufferedReader = 버퍼를 이용한 입력

BufferedWriter = 버퍼를 이용한 출력

이 둘은 입력과 출력을 도와주는 클래스이다.

 

간단히 사용할 수 있는 Scanner와 그 기능이 비슷하다고 할 수 있다.

하지만 Scanner와 어떤 차이가 있을까?

 

Scanner는 입력과 동시에 프로그램에 하나하나 전송이 되지만 BufferedReader는 입력 소스로부터 자신의 내부 버퍼 크기만큼 데이터를 미리 읽고 버퍼에 저장해 둔다. 프로그램은 외부의 입력 소스로부터 읽는 대신 버퍼에 저장된만큼 한번에 읽어들여 읽기 성능과 속도가 향상되는 이점이 있다.

 

자 그럼 이제 코딩으로 들어가보겠습니다.

구구단을 출력하는 프로그램 코딩을 예를 들어보겠습니다.

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;

public class Main {

	public static void main(String[] args) throws Exception{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		
		bw.write("구구단 중에서 출력하고 싶은 단을 입력하시오");
		bw.flush();         //다음 출력을 위해 비워야함
		StringTokenizer st = new StringTokenizer(br.readLine());    //readLine : 라인 전체를 읽음
		
		int num = Integer.parseInt(st.nextToken()); //nextToken 앞에서부터 순서대로 토큰을 받음
		int i = 1;
		while(i<10) {
			bw.write(num + " X " + i + " = " + num*i +"\n");
			bw.flush(); //출력이 반복 진행되므로 반복마다 비워야함
			++i;
		}
	}
}
구구단 중에서 출력하고 싶은 단을 입력하시오 : 9
9 * 1 = 9
9 * 2 = 18
9 * 3 = 27
9 * 4 = 36
9 * 5 = 45
9 * 6 = 54
9 * 7 = 63
9 * 8 = 72
9 * 9 = 81

먼저 상단에 보시면 import 해야하는 것들이 많습니다. 이런경우 import java.io.*; 라고만 써도 io패키지에 속하는 모든 클래스를 포함시킬 수 있습니다. util 패키지도 import java.util.*; 로 동일합니다.

 

그리고 main메소드에 throws Exception 을 넣어줘야하는 것 잊으면 안됩니다. (이부분[예외처리]에 대해서는 기회가 되면 포스팅 해보겠습니다.)

 

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

이와 같이 입력과 출력을 위해 객체를 생성하여 필요할 때마다 사용할 수 있도록 합니다.

 

bw.write() 를 통해 "구구단 중에서 출력하고 싶은 단을 입력하시오" 라는 문장을 출력하고 있습니다.

bw.flush() 는 버퍼를 비워주는 메소드 입니다. (여기서는 문장출력 후 입력 값을 버퍼에 새로 담아야하기 때문에 비워주어야 합니다.)

 

다음으로 StringTokenizer의 객체를 생성하여 입력 라인을 읽고있습니다. 여기서는 단하나의 숫자만 입력할 수 있게 코딩한 프로그램이기 때문에 토큰을 사용할 필요가 없지만 숫자 여러 개를 입력받아 진행하는 코딩의 경우 이렇게 토큰을 사용하면 편리합니다 때문에 여기서는 아래와 같이 StringTokenizer 객체 생성 없이 바로 라인을 읽어들여 변수에 넣어도 하나의 숫자이기 때문에 괜찮습니다.

		//StringTokenizer st = new StringTokenizer(br.readLine());    //readLine : 라인 전체를 읽음
		int num = Integer.parseInt(br.readLine()); //nextToken 앞에서부터 순서대로 토큰을 받음

여기서 BufferedReader를 통해 읽은 데이터는 문자(String)형으로만 받기 때문에 위와 같이 정수 변환 메소드인 parseInt()를 활용하여 변수에 담아야 합니다

 

필자도 처음엔 Scanner를 통해 입출력을 했는데 지금은 간단한 코딩이라도 Buffer를 사용합니다. (규모있는 프로젝트를 수행하면 무조건 사용하는 것이 좋고.. 무엇보다 코딩의 고수가 되기 위해...)

 

다음엔 더 유익한 내용으로 돌아오겠습니다!

반응형

+ Recent posts