<Object가 제공하는 .toString()>
- 생성된 객체의 주소값을 문자열화하여 반환(클래스명@16진수해시코드)
- 주로 엔티티 클래스에서 생성된 객체의 필드 정보를 문자열로 반환하는 역할로 재정의하여 사용
- 클래스 변수를 콘솔에 그대로 출력하면 toString()의 문자열 결과가 출력된다
- 재정의하려는 클래스에서 마우스 우클릭 -> source -> generate toString으로 재정의한 메소드 생성가능
선언부
public String toString() {}
1) toString() 재정의하고 출력
a. toString() 과 클래스 변수를 콘솔에 그대로 출력한 값은 같다
public class A {
public String field01 = "A의 필드1";
public String field02 = "A의 필드2";
public String field03 = "A의 필드3";
public String field04 = "A의 필드4";
public void methodA() {
System.out.println("A의 methodA 호출!");
}
@Override
public String toString() {
return "field01:"+field01+", field02:"+field02
+", field03:"+field03+", field04:"+ field04;
}
}
public class Main02 {
public static void main(String[] args) {
A a = new A();
System.out.println(a.toString());
System.out.println(a.field01);
System.out.println(a.field02);
System.out.println(a.field03);
System.out.println(a.field04);
/*
클래스 변수를 콘솔에 그대로 출력하면 toString()의 문자열 결과가 출력된다
*/
System.out.println(a);
}
}
실행결과)
field01:A의 필드1, field02:A의 필드2, field03:A의 필드3, field04:A의 필드4 A의 필드1 A의 필드2 A의 필드3 A의 필드4 field01:A의 필드1, field02:A의 필드2, field03:A의 필드3, field04:A의 필드4 |
2) 마우스 우클릭 -> source -> generate toString으로 재정의한 메소드
public class Member {
public String id;
public int no;
public Member(String id) {
this.id = id;
}
@Override
public String toString() {
return "Member [id=" + id + ", no=" + no + "]";
}
}
public class Main02 {
public static void main(String[] args) {
Member member = new Member("");
/*
클래스 변수를 콘솔에 그대로 출력하면 toString()의 문자열 결과가 출력된다
*/
System.out.println(member);
}
}
3)
public class SmartPhone {
private String company;
private String os;
public SmartPhone(String company,String os) {
this.company = company;
this.os = os;
}
@Override
public String toString() {
return company + ", " + os;
}
public static void main(String[] args) {
SmartPhone myPhone = new SmartPhone("삼성전자","안드로이드");
String strObj = myPhone.toString(); //toString() 메소드호출
System.out.println(strObj);
System.out.println(myPhone); //toString() 메소드호출
}
}
실행결과)
삼성전자, 안드로이드 삼성전자, 안드로이드 |
4)
public class Member2 {
private String id;
private String name;
public Member2(String id,String name) {
this.id = id;
this.name = name;
}
@Override
public String toString() {
return id + ":" + name;
}
public static void main(String[] args) {
Member2 m2 = new Member2("blue","이파란");
System.out.println(m2);
}
}
실행결과)
blue:이파란 |
<문자열 객체를 생성하는 방법>
1.쌍따옴표를 이용한 리터럴 사용 예시) "ABC"
2.new String(문자열리터럴) 사용 예시) new String("ABC")
3.byte 배열과 new String 사용 예시) byte[] b = {65,66,67}; new String(b);
1) byte를 문자열로 얻어오기
byte[] barr = {65,66,67};
String str = new String(barr);
System.out.println(str);
실행결과)
ABC |
2) 문자열을 byte로 얻어오기
byte[] newBaaray = str.getBytes();
for(byte b : newBaaray) {
System.out.print(b + " ");
}
실행결과)
65 66 67 |
3) 문자열을 byte 배열로 변환시키고 다시 문자열로 복원하는 방법
import java.io.*;
import java.util.*;
public class BytesToStringExample {
public static void main(String[] args) throws Exception {
String data = "자바";
//String -> byte 배열(UTF-8 인코딩)
byte[] arr1 = data.getBytes("UTF-8");
System.out.println("arr1:"+Arrays.toString(arr1));
//byte 배열 -> String(UTF-8 디코딩)
String str1 = new String(arr1,"UTF-8");
System.out.println("str1:"+str1);
//data 변수에 저장된 문자열을 EUC-KR에 해당하는 유니코드 바이트 배열로 얻어오기
//String -> byte 배열(EUC-KR 인코딩)
byte[] arr2 = data.getBytes("EUC-KR");
System.out.println("arr2:"+Arrays.toString(arr2));
//arr2에 있는 유니코드 바이트 배열을 EUC-KR에 해당하는 코드값 문자열로 생성하기
//byte 배열 -> String(EUC-KR 디코딩)
String str2 = new String(arr2,"EUC-KR");
System.out.println("str2:"+str2);
}
}
실행결과)
arr1:[-20, -98, -112, -21, -80, -108] str1:자바 arr2:[-64, -38, -71, -39] str2:자바 |
4) UTF-8 문자셋으로 인코딩한 데이터 배열을 다시 문자열로 디코딩하기
byte[] bytes = { -20, -107, -120, -21, -123, -107 };
String str = new String(bytes,"UTF-8");
System.out.println("str:" + str);
실행결과)
str:안녕 |
<문자열 타입 String 클래스>
String java.lang 패키지 안에 있는 클래스로서 문자열을 다루는 데이터타입
1) toUppperCase() : 문자열을 영문 대문자로 변환
String data = "java";
String newData = data.toUpperCase();
System.out.println("newData:"+newData);
System.out.println("data:"+data);
실행결과)
newData:JAVA data:java |
2) toLowerCase() : 문자열을 영문 소문자로 변환
System.out.println("newData_lower:" + newData.toLowerCase());
System.out.println("newData:"+newData);
실행결과)
newData_lower:java newData:JAVA |
3) trim() : 문자열의 앞뒤 공백 제거
data = " 10 ";
System.out.println(Integer.parseInt(data.trim()));
실행결과)
10 |
4) String.valueOf(기본타입) : 기본타입을 문자열로 반환. 정적메소드
int number = 10;
System.out.println(String.valueOf(number) + 10);
실행결과)
1010 |
5) split(구분자문자열) : 대상 문자열에서 구분자문자열을 기준으로 배열생성
data = "html-java-db-spring";
String[] sArray = data.split("-");
System.out.println(Arrays.toString(sArray));
실행결과)
[html, java, db, spring] |
슬러시(/)를 기준으로 data 문자열을 잘라 문자열 배열을 만들어 모든 원소를 출력
data = "myProject/main/index.html";
sArray = data.split("/");
System.out.println(Arrays.toString(sArray));
System.out.println(sArray[sArray.length-1]); //마지막 주소
실행결과)
[myProject, main, index.html] index.html |
StringBuilder 클래스
- 문자열 임시 저장소
- +연산시 불필요하게 증식되는 문자열 객체에 대응하기 위하여 사용
- 선입선출. 먼저 들어온게 먼저 나옴
- .append(기본값|문자열) : 문자열을 끝에 추가
- .insert(위치,기본값|문자열) : 문자열을 지정 위치에 추가
String은 내부 문자열을 수정할 수 없다.
data 변수의 문자열에 "hello"를 이어붙일 경우 java가 heap 영역에 100번지, hello가 200번지라고 치면 data += "hello"; 를 진행한 data는 heap 영역의 400번지에 새로 저장되는 새로운 객체가 생성된 것이다
data = "java";
data += "hello";
System.out.println(data);
1) insert의 시작값이 1이기 때문에 기존 javahello의 0번째 원소인 j 뒤에 test가 삽입된다
StringBuilder sb = new StringBuilder();
sb.append("java").append("hello").insert(1, "test");
System.out.println(sb.toString());
실행결과)
jtestavahello |
2) delete(3,4) 3번에서 4번 앞까지 제거하기 때문에 3번에 있는 D만 삭제된다
data = new StringBuilder()
.append("DEF") //DEF
.insert(0, "ABC") //ABCDEF
.delete(3, 4) //ABCEF
.toString(); //ABCEF
System.out.println(data);
실행결과)
ABCEF |
3) 1~100까지의 숫자를 통문자열로 만들기
str = "";
StringBuilder sb = new StringBuilder();
for(int i = 1; i <= 100; i++) {
sb.append(i);
}
System.out.println(sb.toString());
실행결과)
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100 |
StringTokenizer 클래스
- .split()과 다르게 정규표현식이 아닌 문자로 구분
- countTokens() : 분리할 수 있는 문자열의 총 수. 리턴타입 int
- .hasMoreTokens() : 남아 있는 문자열이 있는지 여부. 리턴타입 boolean
- .nextToken() : 문자열을 하나씩 가져옴. 리턴타입 String
import java.util.*;
public class StringTokenizerExample {
public static void main(String[] args) {
String data1 = "홍길동&이수홍,박연수";
String[] arr = data1.split("&|,");
for(String token : arr) {
System.out.println(token);
}
System.out.println();
String data2 = "홍길동/이수홍/박연수";
StringTokenizer st = new StringTokenizer(data2,"/");
while(st.hasMoreTokens()) {
String token = st.nextToken();
System.out.println(token);
}
}
}
실행결과)
홍길동 이수홍 박연수 홍길동 이수홍 박연수 |
Math 클래스
- 절대값 int v1 = Math.abs(-5); v1 = 5
- 올림값 double v3 = Math.ceil(5.3); v3 = 6.0; | double v4 = Math.ceil(-5.3); v4 = -5.0;
- 버림값 double v5 = Math.floor(5.3); v5 = 5.0; | double v6 = Math.floor(-5.3); v6 = -6.0;
- 반올림값 long v14 = Math.round(5.3); v14 = 5; | long v15 = Math.round(5.7); v15 = 6; 반올림한 결과는 소수점이 없는 형태로 나옴
public class MathExample {
public static void main(String[] args) {
//큰 정수 또는 작은 정수 얻기
double v1 = Math.ceil(5.3);
double v2 = Math.floor(5.3);
System.out.println("v1:"+v1);
System.out.println("v2:"+v2);
//큰값 또는 작은값 얻기
long v3 = Math.max(3, 7);
long v4 = Math.min(3, 7);
System.out.println("v3:"+v3);
System.out.println("v4:"+v4);
//소수 이하 두 자리 얻기
double value = 12.3456;
double temp1 = value * 100; //1234.56
long temp2 = Math.round(temp1); //1235
double v5 = temp2/100.0; //12.35
System.out.println("v5:"+v5);
}
}
실행결과)
v1:6.0 v2:5.0 v3:7 v4:3 v5:12.35 |
포장(Wrapper)클래스
- 기본 타입을 객체화 시킬수 있는 클래스들을 의미함
- 기본타입을 통해 활용할 수 있는 여러 상수와 메소드를 제공하는 클래스
<기본타입들에 대한 Wrapper 클래스 종류>
기본타입 | 클래스 |
byte | Byte |
short | Short |
char | Character |
int | Integer |
long | Long |
float | Float |
double | Double |
boolean | Boolean |
박싱
:기본타입 데이터를 객체화 하는 것을 의미
언박싱
:기본타입 객체를 다시 기본타입으로 돌리는 것을 의미
1) 박싱한(객체화한) 기본타입은 equals 메소드를 통해서 값의 비교를 할 수 있다
Integer number = new Integer(100);
Integer number2 = new Integer(100);
System.out.println(number == number2); //false new 연산자로 만든 객체이기 때문
System.out.println(number.equals(number2)); //true
실행결과)
false true |
2) 언박싱하는 방법
박싱과 언박싱은 자동형변환이 되기 때문에 타입이 달라도 상관없다
int num = number.intValue(); //.타입Value() : 객체 내부의 타입값을 리턴
int num2 = number2; //(언박싱)자동형변환
System.out.println(num == num2); //true
number2 = num2; //(박싱)자동형변환
실행결과)
true |
3) 박싱, 언박싱, 연산 시 언박싱
//박싱
Integer obj = 100;
System.out.println("value:" + obj.intValue());
//언박싱
int value = obj;
System.out.println("value:" + value);
//연산 시 언박싱
int result = obj + 100;
System.out.println("result:" + result);
실행결과)
value:100 value:100 result:200 |
4) byte 범위초과할 경우 ==(동등비교연산자) 결과가 다르게 나올 수 있음
//-128~127(byte범위) 초과값일 경우
Integer obj1 = 300;
Integer obj2 = 300;
System.out.println("==:"+(obj1 == obj2)); //false
System.out.println("equals():" + obj1.equals(obj2)); //true
System.out.println();
//-128~127(byte범위) 범위값일 경우
Integer obj3 = 10;
Integer obj4 = 10;
System.out.println("==:"+(obj3 == obj4)); //true
System.out.println("equals():" + obj3.equals(obj4)); //true
System.out.println();
실행결과)
==:false equals():true ==:true equals():true |
'Java' 카테고리의 다른 글
[Java] 제네릭 (0) | 2024.08.14 |
---|---|
[Java] Date, SimpleDateFormat, Calendar (0) | 2024.08.13 |
[Java] Object, equals(), hashCode() (0) | 2024.08.09 |
[Java] 예외처리 (0) | 2024.08.08 |
[Java] 익명 객체, 다중인터페이스 (0) | 2024.08.07 |