JAVA 9일차

MOZZI KIM·2022년 11월 3일
0

JAVA

목록 보기
9/21
post-thumbnail

1. 아래를 프로그래밍 하시오.

다음 멤버를 가지고 직사각형을 표현하는 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를 포함합니다.");
		}
	}

}

2.스트링 객체를 생성하는 2가지 방법?

Java에서 문자열을 나타내는 String 객체를 선언하는 방법

  1. new 연산을 통해 객체를 생성하는 방법
  2. ""를 이용해서 생성하는 리터럴 방식 방법
String a = new String("Hello"); //new 연산
String b = "Hello"; //리터럴 방식

3. String 객체가 immutable 인 이유는?

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은 파라미터 형태로 자주 사용된다.

  • 네트워크 연결을 위한 호스트 이름과 포트 이름
  • DB 연결을 위한 URL
  • Java에서 파일 실행을 위해 File I/O 클래스의 인자로서 전달되는 파일 이름

위와 같은 작업 시 String이 Immutable 하다는 것이 보안상의 이점이 된다.
String이 Immutable하지 않다면, 객체의 값이 변경될 수 있다면 악의를 가진 누군가에 의해 파일 이름 및 접근 경로가 변경될 위험이 있다.

멀티스레딩에서의 이점
String 객체는 Thread Safe 하다. 여러 스레드에서 동시에 특정 String 객체를 참조하더라도 안전하다.

String 객체의 참조값이 바뀌면 바뀐 참조값을 가진 새로운 객체가 생성된다. 따라서 최초에 생성된 String 객체에는 변동이 없다. 이는 최초에 생성된 String 객체의 참조값이 다른 객체의 참조값과 동기화될 염려가 없다는 것이다.


4. 사용자로부터 받은 문자열(영문으로)에서 자음과 모음 개수를 계산하는 프로그램을 작성하라.

힌트: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 + "개");

	}

}

5. 사용자에게 받은 문자열을 역순으로 화면에 출력하는 프로그램을 작성하시오.

힌트: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));
		}

	}

}

6. String 클래스에서 concat 메서드를 설명하시오.

String의 인스턴스를 하나 이상 연결하거나 String의 인스턴스 값에 해당하는 Object 표현을 하나 이상 연결합니다.

concat은 String 클래스에서 제공하는 기본 메서드이며 동작 방법은 합친 문자열을 String으로 생성한다. 

concat()메서드를 이용해서 문자열을 추가할 때마다,
새로운 인스턴스를 생성하기 때문에 성능이나 속도 면에서 좋지 않다.
 

String str1 = "첫번째 텍스트입니다 "; 
String str2 = "두번째 텍스트입니다"; 
System.out.println("결과: " + str1.concat(str2)); 

//결과 : 첫번째 텍스트입니다 두번째 텍스트입니다

7. str.substring(2, 4); substring 사용법에 대하여 설명하시오.

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

8. String.valueOf 에 대하여 설명하시오.


9. st1.compareTo(st2);compareTo 사용법에 대하여 설명하시오.

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

    }
}

10. 아래의 연산과정에서 호출되는 함수(원리)를 써서 표현해 보세요.

String str = "age: " + 17;

"age: ".concat(String.valueOf("17"));
숫자를 문자열로 형변환 해서 붙인다.

11. StringBuilder 와 String 의 차이는?

String, StringBuffer, StringBuilder 차이점과 장단점.

String, StringBuffer, StringBuilder.. 모두 문자열을 저장하고, 관리하는 클래스입니다.


- String

먼저 String과 다른 클래스(StringBuffer, StringBuilder)의 차이점은 두 문자열 클래스의 아주 기본적인 차이는 String은 immutable(불변), StringBuffer는 mutable(변함)에 있다.

  • String은 문자열을 대표하는 것으로 문자열을 조작하는 경우 유용하게 사용할 수 있다. 문자열, 숫자, char 등은 concat할때는 StringBuffer, StringBuilder를 사용할 수 있습니다.
    단, 복잡한 경우 의미가 있고, 단순한 경우에는 굳이 StringBuffer, StringBuilder를 쓰지 않고 +연산자를 활용해 직접 합지면된다.
  • String 객체는 한번 생성되면 할당된 메모리 공간이 변하지 않는다. + 연산자 또는 concat 메서드를 통해 기존에 생성된 String 클래스 객체 문자열에 다른 문자열을 붙여도 기존 문자열에 새로운 문자열을 붙이는 것이 아니라, 새로운 String 객체를 만든 후, 새 String 객체에 연결된 문자열을 저장하고, 그 객체를 참조한다.
    (즉, String 클래스 객체는 Heap 메모리 영역(가비지 컬렉션이 동작하는 영역)에 생성. 한번 생성된 객체의 내부 내용을 변화시킬 수 없다. 기존 객체가 제거되면 Java의 가비지 컬렉션이 회수함.)
  • String 객체는 이러한 이유로 문자열 연산이 많은 경우, 그 성능이 좋지 않다.
  • 하지만, Immutable한 객체는 간단하게 사용가능하고, 동기화에 대해 신경쓰지 않아도 되기때문에(Thread-safe), 내부 데이터를 자유롭게 공유 가능.

- StringBuffer와 StringBuilder

문자열 연산 등으로 기존 객체의 공간이 부족하게 되는 경우,
기존의 버퍼 크기를 늘리며 유연하게 동작합니다. StringBuffer와 StringBuilder 클래스가 제공하는 메서드는 서로 동일합니다.

그럼 두 클래스의 차이점은? 동기화 여부에 있다.

  • StringBuffer는 각 메서드별로 Synchronized Keyword가 존재하여, 멀티스레드 환경에서도 동기화를 지원.

  • 반면, StringBuilder는 동기화를 보장하지 않음.

  • 그렇기때문에 멀티스레드 환경이라면 값 동기화 보장을 위해 StringBuffer를 사용하고,
    단일스레드 환경이라면 StringBuilder를 사용하는 것이 좋다. 단일 스레드환경에서 StringBuffer를 사용한다고 문제가 되는 것은 아니지만, 동기화 관련 처리로 인해 StringBuilder에 비해 성능이 좋지 않다.

String은 짧은 문자열을 더할 경우 사용합니다.

StringBuffer는 스레드에 안전한 프로그램이 필요할 때나, 개발 중인 시스템의 부분이 스레드에 안전한지 모를 경우 사용하면 좋습니다.

StringBuilder는 스레드에 안전한지 여부가 전혀 관계 없는 프로그램을 개발할 때 사용하면 좋습니다.

단순히 성능만 놓고 본다면 연산이 많은 경우, StringBuilder > StringBuffer >>> String

profile
코린이

0개의 댓글