다음 멤버를 가지고 직사각형을 표현하는 Rectangle 클래스를 작성하라.
- int 타입의 x, y, width, height 필드: 사각형을 구성하는 점과 크기 정보
- x, y, width, height 값을 매개변수로 받아 필드를 초기화하는 생성자
- int square() : 사각형 넓이 리턴
- void show() : 사각형의 좌표와 넓이를 화면에 출력
- boolean contatins(Rectangle r) : 매개변수로 받은 r이 현 사각형 안에 있으면 true 리턴
- main() 메소드의 코드와 실행 결과는 다음과 같다
public static void main(String[] args) {
Rectangle r = new Rectangle(2, 2, 8, 7);
Rectangle s = new Rectangle(5, 5, 6, 6);
Rectangle t = new Rectangle(1, 1, 10, 10);
r.show();
System.out.println("s의 면적은 "+s.square());
if(t.contains(r)) System.out.println("t는 r을 포함합니다.");
if(t.contains(s)) System.out.println("t는 s를 포함합니다.");
}
출력
========================
(2,2)에서 크기가 8x7인 사각형
s의 면적은 36
t는 r을 포함합니다.
package Prac;
class Rectangle{
private int x, y, width, height;
private int x2, y2;
public Rectangle(int x, int y, int w, int h) {
this.x = x;
this.y = y;
this.width = w;
this.height = h;
}
public int square() { //사각형의 넓이
return width * height;
}
public void show(){ //사각형의 좌표와 넓이를 화면에 출력
System.out.println("(" + x + "," + y + ") 에서 크기가 " + width + "x" + height + "인 사각형");
}
public boolean contains(Rectangle compare) {
this.x2 = x + width;
this.y2 = y + height;
if((this.x < compare.x) && (this.y2 > compare.y2) && (this.x2 > compare.x2) ){
//x=y 값이 같아서 시작값은 x만 비교함
return true;
}else {
return false;
}
}
}
public class RectangTest {
public static void main(String[] args) {
Rectangle r = new Rectangle(2, 2, 8, 7);
Rectangle s = new Rectangle(5, 5, 6, 6);
Rectangle t = new Rectangle(1, 1, 10, 10);
r.show();
System.out.println("s의 면적은 "+s.square());
if(t.contains(r)) {
System.out.println("t는 r을 포함합니다.");
}
if(t.contains(s)) {
System.out.println("t는 s를 포함합니다.");
}
}
}
Java에서 문자열을 나타내는 String 객체를 선언하는 방법
String a = new String("Hello"); //new 연산
String b = "Hello"; //리터럴 방식
String 객체의 불변성(Immutability)
String 객체는 불변성(Immutability)을 가진다. String 객체가 한 번 생성되면 생성된 값은 변하지 않는다.
아래 코드는 doraemon 이라는 String 객체를 생성한 후, 해당 객체에 다른 값을 할당했다. 처음 생성된 String 객체의 값 "aaa"가 "bbb"로 변경되었으니 doraemon 객체의 값은 "bbb"라고 생각할 수 있지만, 틀렸다. String 객체의 값이 변경된것이 아닌 새로운 String 객체가 생성되어 그 참조가 doraemon 변수에 할당된 것이다.
String doraemon = "aaa";
doraemon = "bbb";
처음 생성한 "aaa"와 이후 새롭게 생성된 "bbb" 두 개의 인스턴스가 Heap 영역에 저장된 것이다.
아래 그림과 같이 변수 doraemon은 "aaa"를 참조하다가 "bbb를 참조하도록 재할당 되었다.
더이상 참조되지 않는 값(사용되지 않는 값) "aaa"는 Garbage Collection의 제거 대상이 된다.
보안상의 이점
Java에서 String은 파라미터 형태로 자주 사용된다.
위와 같은 작업 시 String이 Immutable 하다는 것이 보안상의 이점이 된다.
String이 Immutable하지 않다면, 객체의 값이 변경될 수 있다면 악의를 가진 누군가에 의해 파일 이름 및 접근 경로가 변경될 위험이 있다.
멀티스레딩에서의 이점
String 객체는 Thread Safe 하다. 여러 스레드에서 동시에 특정 String 객체를 참조하더라도 안전하다.
String 객체의 참조값이 바뀌면 바뀐 참조값을 가진 새로운 객체가 생성된다. 따라서 최초에 생성된 String 객체에는 변동이 없다. 이는 최초에 생성된 String 객체의 참조값이 다른 객체의 참조값과 동기화될 염려가 없다는 것이다.
힌트:String 객체의 charAt 함수를 활용
입력:abcd
출력
==============================
총글자수는 4개
자음:3 개
모음:1 개
package Prac;
import java.util.*;
public class textTest {
public static void main(String[] args) {
int j = 0;
int m = 0;
String str;
System.out.print("입력: ");
Scanner sc = new Scanner(System.in);
str = sc.next();
for(int i =0; i < str.length(); i++) { //index 0번부터 시작
switch(str.charAt(i)) { //문자열을 캐릭터로 바꾼 뒤 비교
case 'a' :
case 'e':
case 'i':
case 'o':
case 'u':
m++;
break;
default:
j++;
}
}
System.out.println("총 글자 수: "+ str.length()+"개");
System.out.println("모음 : " + m + "개");
System.out.println("자음 : " + j + "개");
}
}
힌트:String 객체의 charAt 함수를 활용
입력:abcde
출력:edcba
package Prac;
import java.util.*;
public class Reverse {
public static void main(String[] args) {
String str;
Scanner sc = new Scanner(System.in);
System.out.println("영어 단어를 입력하세요.");
str = sc.next();
for (int i = str.length()-1; i>=0; i--){
System.out.print(str.charAt(i));
}
}
}
String의 인스턴스를 하나 이상 연결하거나 String의 인스턴스 값에 해당하는 Object 표현을 하나 이상 연결합니다.
concat은 String 클래스에서 제공하는 기본 메서드이며 동작 방법은 합친 문자열을 String으로 생성한다.
concat()메서드를 이용해서 문자열을 추가할 때마다,
새로운 인스턴스를 생성하기 때문에 성능이나 속도 면에서 좋지 않다.
String str1 = "첫번째 텍스트입니다 ";
String str2 = "두번째 텍스트입니다";
System.out.println("결과: " + str1.concat(str2));
//결과 : 첫번째 텍스트입니다 두번째 텍스트입니다
substring이란?
문자열에서 특정한 구간의 문자열을 추출해준다.
string.substring(from,to)
from : 탐색구간의 시작점(index) , 꼭 있어야 함
to : 탐색구간이 끝나는 점, 0 index부터 시작됨, 꼭 없어도 된다.
===================================================================
var str = 'coding everybody';
alert(str.substring(0)) // coding everybody
alert(str.substring(0,6)) // coding
alert(str.substring(7,0)); // coding
alert(str.substring(7,2)); // ding
public class CompareToTest{
public static void main(String[] args){
Integer x = 3;
Integer y = 4;
Double z = 1.0;
System.out.println( x.compareTo(y) ); // -1
System.out.println( x.compareTo(3) ); // 0
System.out.println( x.compareTo(2) ); // 1
System.out.println( z.compareTo(2.7) ); // -1
String str = "abcd";
// 1) 비교대상에 문자열이 포함되어있을 경우
System.out.println( str.compareTo("abcd") ); // 0 (같은 경우는 숫자나 문자나 0을 리턴)
System.out.println( str.compareTo("ab") ); // 2
System.out.println( str.compareTo("a") ); // 3
System.out.println( str.compareTo("c") ); // -2
System.out.println( "".compareTo(str) ); // -4
// 2) 비교대상과 전혀 다른 문자열인 경우
System.out.println( str.compareTo("zefd") ); // -25
System.out.println( str.compareTo("zEFd") ); // -25
System.out.println( str.compareTo("ABCD") ); // 32
}
}
String str = "age: " + 17;
"age: ".concat(String.valueOf("17"));
숫자를 문자열로 형변환 해서 붙인다.
String, StringBuffer, StringBuilder 차이점과 장단점.
String, StringBuffer, StringBuilder.. 모두 문자열을 저장하고, 관리하는 클래스입니다.
- String
먼저 String과 다른 클래스(StringBuffer, StringBuilder)의 차이점은 두 문자열 클래스의 아주 기본적인 차이는 String은 immutable(불변), StringBuffer는 mutable(변함)에 있다.
- StringBuffer와 StringBuilder
문자열 연산 등으로 기존 객체의 공간이 부족하게 되는 경우,
기존의 버퍼 크기를 늘리며 유연하게 동작합니다. StringBuffer와 StringBuilder 클래스가 제공하는 메서드는 서로 동일합니다.
그럼 두 클래스의 차이점은? 동기화 여부에 있다.
StringBuffer는 각 메서드별로 Synchronized Keyword가 존재하여, 멀티스레드 환경에서도 동기화를 지원.
반면, StringBuilder는 동기화를 보장하지 않음.
그렇기때문에 멀티스레드 환경이라면 값 동기화 보장을 위해 StringBuffer를 사용하고,
단일스레드 환경이라면 StringBuilder를 사용하는 것이 좋다. 단일 스레드환경에서 StringBuffer를 사용한다고 문제가 되는 것은 아니지만, 동기화 관련 처리로 인해 StringBuilder에 비해 성능이 좋지 않다.
String은 짧은 문자열을 더할 경우 사용합니다.
StringBuffer는 스레드에 안전한 프로그램이 필요할 때나, 개발 중인 시스템의 부분이 스레드에 안전한지 모를 경우 사용하면 좋습니다.
StringBuilder는 스레드에 안전한지 여부가 전혀 관계 없는 프로그램을 개발할 때 사용하면 좋습니다.
단순히 성능만 놓고 본다면 연산이 많은 경우, StringBuilder > StringBuffer >>> String