[필기정리]Day8-2 - compareTo, 메소드체이닝 등

SW/Java

2020. 6. 21. 19:54

#string 클래스 내 메소드 사용법

class StringMethod
{
	public static void main(String[] args)
	{
		String str1="Smart";
		String str2=" and ";
		String str3="Simple";
		String str4=str1.concat(str2).concat(str3);
				 // concat String의 주소값이 반환시키므로 .으로 연결해준것
		
		System.out.println(str4);	
		System.out.println("문자열 길이: "+str4.length());

		if(str1.compareTo(str3)<0)
			System.out.println("str1이 앞선다");
		else
			System.out.println("str3이 앞선다");
	}
}

String name = "홍길동“;

- “”만으로 객체를 만들 수 있다(스트링을 많이 사용하기 때문에 편리하게 사용할 수 있도록 되어 있는 것)

 

# 도큐먼트 보는 법

자바 사이트 → Java APIs - Java SE Documentation JDK8 Java SE API Documentation

 java.util Scanner 아래에서 클래스 찾기

 

import java.util.Scanner;
class SCTest
{
	public static void main(String[] args)
	{
		Scanner sc = new Scanner(System.in);
		String str = sc.nextLine(); //Hello World
		System.out.println(str);
	}
}

/* 결과 : Hello World 치니까
          Hello World */

- .nextLine 엔터를 칠 때까지 자기의 입력값으로 받아들임

 

import java.util.Scanner;
class SCTest
{
	public static void main(String[] args)
	{
		Scanner sc = new Scanner(System.in);
		String str = sc.next(); //Hello World
		System.out.println(str);
	}
}

/* 결과 : Hello World 치니까
         Hello */

.next(); 엔터키값 또는 공백까지를 키 값으로 받아들임

 

import java.util.Scanner;
class SCTest
{
	public static void main(String[] args)
	{
		Scanner sc = new Scanner(System.in);
		String str = sc.next(); //Hello World
		System.out.println(str.length());
	}
}

/* 결과 : Hello치니까
         5 */

- length() : 이 문자열의 길이를 반환한다. (반환값의 자료형은 int)

 

Q. 임의의 문자열 두개를 입력받아 두 문자열 합치기, 대문자로 변환, 소문자로 변환시키기

A.

import java.util.Scanner;
class SCTest
{
	public static void main(String[] args)
	{
		Scanner sc = new Scanner(System.in);
		String str1 = null, str2 = null;
		str1 = sc.nextLine();
		str2 = sc.nextLine();
		System.out.println(str1.concat(str2)); // 문자열 합치기
		System.out.println(str1+str2);
		System.out.println(str.toUpperCase()); // 대문자
		System.out.println(str.toLowerCase()); // 소문자
	}
}

 

- compareTo : 두 문자열을 비교하는 메소드 

- c에서는 아스키코드로 char 1바이트로 표현함

A B C     /  a b c d

65 66 67 /  97 98 99 100

 

ex)

String str1="AAA";
String str2="AAA";
int r=srt1.compareTo(srt2);  // 결과 : r = 0

String str1="AAA";
String str2="BBB";
int r=srt1.compareTo(srt2); // 결과 : r = -1

String str1="AAA";
String str2="CCC";
int r=srt1.compareTo(srt2); // 결과 : r = -2

String str1="CCC";
String str2="AAA";
int r=srt1.compareTo(srt2); // 결과 : r = 2

String str1="AAA";
String str2="AAC"; // 처음으로 다른 부분에서 연산이 일어남(같은 부분은 연산 안함)
int r=srt1.compareTo(srt2); // 결과 : r = -2

Q. 알파벳순으로 정렬하시오.

A.

String tmp=null; 
String str1"Bill", str2"David", str3"Alice", str4"Candy";
if(str1.compareTo(str2)>0)
{
	tmp=str1;
	str1=str2;
	str2=tmp;
}
if(str1.compareTo(str3)>0)
{
	tmp=str1;
	str1=str3;
	str3=tmp;
}
if(str1.compareTo(str4)>0)
{
	tmp=str1;
	str1=str4;
	str4=tmp;
}
if(str2.compareTo(str3)>0)
{
	tmp=str2;
	str2=str3;
	str3=tmp;
}
if(str2.compareTo(str4)>0)
{
	tmp=str2;
	str2=str4;
	str4=tmp;
}	
if(str3.compareTo(str4)>0)
{
	tmp=str3;
	str3=str4;
	str4=tmp;
}
System.out.println(str1+" "+str2+" "+str3+" "+str4);	

- 한글도 이 방법 가능하다 ex) 주소록

 

# 메소드 체이닝(Method Chaining - 체인처럼 연결되었다 의미)

ex)

class Number
{
	int num
	public Number add(int num)
	{
		this.num+=num;
		return this;
	}
	public void printNum()
	{
		System.out.println(num);
	}
}
class NumberMain
{
	public static void main(String[] args)
	{
		Number n1 = new Number();
		n1.add(3). add(5). add(2). printNum(); // 문법적으로 이상없음
		// 1000번지라는 주소값에 리턴 add 3+5+2 ∴10이라고 출력함
        
		n1.add(3). add(5). printNum(). add(2). printNum();
		/* 에러발생 무조건.으로 연결할 수 있는 것이 아님
		   .앞에 주소가 있어야 하는데 printNum()은 void를 리턴해 주소가 없으므로 불가
		   사용을 원하는 경우 public void printNum()에서 void를 Number로 바꾸고 
	           return this; 추가해주는 경우 에러나지 않고 가능하다*/	
	}
}	

ex)

(new Number()).add(5);

- 객체를 생성하고 해당 주소 생기므로 에러 발생하지 않음

  단, 주소를 가지고 있는 것이 없기 때문에 주소에 접근할 수 없어 가비지 컬렉터에 언젠가 메모리 지워짐

 

- String의 특징 : 문자열은 변경이 되지 않는다

ex)

String str1="홍길동";
str1="임꺽정";
System.out.println(str1); // 결과 : 임꺽정

 

기존의 똑같은 문자열이 있으면 기존의 문자열을 가리키게 된다(메모리 과부하 방지 위함)

ex)

String str1="홍길동";
String str2="홍길동";
str1="임꺽정";

 

- String str2=new String(str1); 기존에 똑같은 문자열이 있더라도 새로운 인스턴스를 만듬

 

- “ ”와 생성자는 작동원리가 다르다

  명시적으로 복사가 필요하는 상황이 아니라면 이 생성자는 필요없다고 도큐먼트에 설명되어 있음

 

 

import java.lang.*; - 자바가 자동으로 삽입시켜주기 때문에 스트링을 자동으로 사용할 수 있는 것임

ex) 공백을 포함한 문자열의 길이를 구하는 것임

class StringInstance
{
	public static void main(String[] args)
	{
		java.lang.String str="My name is Sunny";
		
		int strLen1=str.length();
		System.out.println("길이 1: "+strLen1);
		
		int strLen2="한글의 길이는 어떻게?".length();
		System.out.println("길이 2: "+strLen2);
	}
}

- “ ”하면 스트링 객체 생성 -> length로 객체 주소 반환 -> 문자열의 길이 리턴

 

ex)

class ImmutableString
{
	public static void main(String[] args)
	{
		String str1="My String";
		String str2="My String";		
		String str3="Your String";
		
		if(str1==str2)
			System.out.println("동일 인스턴스 참조");  // 결과 : 동일 인스턴스 참조
		else
			System.out.println("다른 인스턴스 참조");		
		
		if(str2==str3)
			System.out.println("동일 인스턴스 참조");
		else
			System.out.println("다른 인스턴스 참조"); // 결과 : 다른 인스턴스 참조	
		
	}
}

ㄴ 자바는 주소값을 찍어볼 순 없지만 비교할 순 있음

 

class StringMethod
{
	public static void main(String[] args)
	{
		String str1="Smart";
		String str2=" and ";
		String str3="Simple";
		String str4=str1.concat(str2).concat(str3);
				             // concat String의 주소값이 반환시키므로 .으로 연결해준것
		
		System.out.println(str4);	
		System.out.println("문자열 길이: "+str4.length());

		if(str1.compareTo(str3)<0)
			System.out.println("str1이 앞선다");
		else
			System.out.println("str3이 앞선다");
	}
}
class StringCopy
{
	public static void main(String[] args)
	{
		String str1="Lemon";
		String str2="Lemon";
		String str3=new String(str2);
		
		if(str1==str2)
			System.out.println("str1과 str2는 동일 인스턴스 참조");
		else
			System.out.println("str1과 str2는 다른 인스턴스 참조");			
		
		if(str2==str3)
			System.out.println("str2와 str3는 동일 인스턴스 참조");
		else
			System.out.println("str2와 str3는 다른 인스턴스 참조");	
	}
}

ex)

class StringAdd
{
	public static void main(String[] args)
	{
		String str1="Lemon"+"ade"; // “Lemon".concat("ade")
		String str2="Lemon"+'A';   // “Lemon".concat(String.valueOf('A')); 
		String str3="Lemon"+3;	  // “Lemon".concat(String.valueOf(3));  
		String str4=1+"Lemon"+2; // new StringBuilder().append(1).append("Lemon").append(2).toString()
		str4+='!';                                    // ㄴ 내부적 연산
		
		System.out.println(str1);		
		System.out.println(str2);		
		System.out.println(str3);		
		System.out.println(str4);
	}
}

- static valueOf : char, intstring으로 형변환 해주는 것

 

ex)

class BuilderString
{
	public static void main(String[] args)
	{
		StringBuilder strBuf=new StringBuilder("AB");
		strBuf.append(25);                       //AB25
		strBuf.append('Y').append(true);           //AB25Ytrue 
		System.out.println(strBuf);		       //AB25Ytrue 
		                                            
		strBuf.insert(2, false);                    //ABfalse25Ytrue 
		strBuf.insert(strBuf.length(), 'Z');          //ABfalse25YtrueZ 
		System.out.println(strBuf);               //ABfalse25YtrueZ
	}
}

- StringBuilder(클래스종류)는 생성자 중에 문자열을 받음

  16바이트의 버퍼(메모리)를 가지고 있다

  16을 넘어서면 자동으로 늘어남(부하를 일으킴)

  처음부터 적절한 길이를 주고서 생성해주는 것이 좋다

 

- toString() : StringBuilder에서 string으로 형변환해줌 

class SimpleAdder
{
	private int num;
	public SimpleAdder(){num=0;}
	
	public SimpleAdder add(int num)
	{
		this.num+=num;
		return this;
	}
	public void showResult()
	{
		System.out.println("add result: "+num);
	}
}

class SelfReference
{
	public static void main(String[] args)
	{
		SimpleAdder adder=new SimpleAdder();
		adder.add(1).add(3).add(5).showResult();
	}

 

Q. 문제 [StringBuilder의 API 문서 참조]

String str1 = "ABCDEFGHIJKLMN"; 역순으로 출력

String str2 = "990208-1012752" 이 문자열을 활용하여 중간에 삽입된 -를 삭제한 String 인스턴스를 생성.

 

A.

class StringTest2
{
	public static void main(String[] args)
	{
		String str1 = "ABCDEFGHIJKLMN";
   		String str2 = "990208-1012752";
		int idx=0;

		StringBuilder sb1 = new StringBuilder(str1);
		StringBuilder sb2 = new StringBuilder(str2);

		System.out.println(sb1.reverse().toString());
		
		idx = sb2.indexOf("-");
		if(idx != -1)
			System.out.println(sb2.deleteCharAt(idx).toString());
	}
}

 

728x90