728x90

 

2.다항연산자

1)산술연산자 :

2)비교연산자 : >, <, =, >=, <=, ==, !=

3)논리연산자 : and(&&), or(\\) ||

4)복합대입연산자 : +=, -=, *=, /=, %=

5)삼항연산자 : 조건식 ? 식1 : 식2;

 

 

1)산술연산자

기호 : + - * / %

% : 모듈러라고 부름. 몫을 뺀 ‘나머지’ 연산

연산시, 곱하기 나누기 모듈러 먼저 계산사칙연산

	public void method1() {
        int num1 = 10;
        int num2 = 3;
        System.out.println("num1 + num2 = " + (num1 + num2));
        System.out.println("num1 - num2 = " + (num1 - num2));
        System.out.println("num1 * num2 = " + (num1 * num2)); // 나누기(/)는 나눗셈에 대한 몫 계산
        System.out.println("num1 / num2 = " + (num1 / num2));
    //	System.out.println("num1 / num2 = " + (num1 / num0)); error 0을 나눌 수 없으므로 에러
        System.out.println("num1 % num2 = " + (num1 % num2)); // %(모듈러)는 나눗셈에서 발생하는 나머지 계산	
    
    	double add = a + b;	// 45.0
        double sub = a - b;	// 25.0
        double mul = a * b;	// 350.0
        double div = a / b;	// 3.5	// 변수를 int로 바꾸면 3.0나옴
        double mod = a % b;	// 5.0
}

 

2)비교연산자

기호 : >, <, >=, <=, ==, !=

<=, >=에서 =가 뒤에와야함. 에러발생

 

짝수 & 홀수 만들기

2로 나누어서 0이면 짝수 2로 나누어서 1이면 홀수

 

짝수 판별 구분식

  1. b % 2 == 0
  2. b % 2 != 1

 

홀수 판별 구분식

1)b % 2 == 1

2)b % 2 != 0

3) !(b % 2 == 0)

int a = 10;
int b = 25;

boolean result1 = (a == b); // false
boolean result2 = (a <= b);	// true
boolean result3 = (a > b);	// false

System.out.println("b가 짝수인가? " + (b % 2 == 0));
System.out.println("b가 짝수인가? " + (b % 2 != 1));
System.out.println("b가 홀수인가? " + (b % 2 == 1));
System.out.println("b가 홀수인가? " + (b % 2 != 0));
System.out.println("b가 홀수인가? " + !(b % 2 == 0)); // ()안이 true/false 결과이기에 결과 역전 !으로 홀수판별

 

 

3)논리연산자

기호 : && ||

논리값 비교

비교 연산 후의 결과 값은 항상 논리값(boolean, true/false) 값임

조건문 연결하는 중요 역할

  • and연산자( && ) :~고, 이며, ~동시에ex) 이름이 박신이고 키가 160cm이며 성별은 여자고 신발사이즈 230mm인 사람을 찾아라
  • 모든 연산이 true여야 true값 반환
  • or 연산자 ( || ) : ~이거나, 또는
  • 논리 값 중 하나라도 true여야 true값 반환

 

Scanner sc = new Scanner(System.in);
System.out.print("정수 하나 입력 : ");
int num = sc.nextInt();

System.out.println(num + " 숫자가 1~100사이 숫자인가? "
                    + (num >= 1 && num <= 100));
                    
System.out.println("계속 하겠다고 하셨습니까? " + (yn == 'Y' || yn == 'y'));

 

4)복합대입연산자

기호 : +=, -=, *=, /=, %=

성능면에서 일반 대입연산자 사용한 것보다 유리

int a = 1; 

a = a + 3; // 1+3 = 4 // a += 3; 복합대입연산자
a = a - 3; // 4-3 = 1 // a -= 3;
a = a * 3; // 1*3 = 3 // a *= 3;
a = a / 3;            // a /= 3;
a = a % 3;            // a %= 3;

*증감 연산자(++,- -)는 1이 고정이지만 복합대입연산자는 제한x

		int a = 10;
		a = a + 4;
		a += 4;
		System.out.println(a);
		
		int b = 8;
		b = b - 3;
		b -= 3;
		System.out.println(b);
		
		int c =15;
		c = c * 2;
		c *= 2;
		System.out.println(c);
		
		int d = 42;
		d = d / 7;
		d /= 7;
		System.out.println(d);
		
		int e = 24;
		e = e % 4;
		e %= 4;
		System.out.println(e);

 

5)삼항연산자

// 조건식 ? 식1 : 식2;
ex) a > b ? a++ : b--;

조건식 결과값 : boolean true/false

결과값이 true라면 수행되는 식 : 식1

결과값이 false라면 수행되는 식 : 식2

삼항연산자 중첩

조건식1 ? 식1 : (조건식2 ? 식2 : 식3);

조건식1이 true면 조건식1이 수행됨

조건식1이 false면 조건식2가 수행되고 거기서 또 true/false\

int a = 3;
int b = 2;

a > b ? a++ : b--;
// a>b가 true면 a++ 수행 or 변수로 들어감
// a>b가 false면 b-- 수행 or 변수로 들어감

int result1 = a > b ? a++ : b--;
// a>b가 true라면, a++이 result1변수로 대입
int result1 = a++;

int a = 3;
int b = 2;
a < b ? a++ : (b == 0 ? a-- : b++);   // b++ 실행
// 조건식1 false -->조건식2 수행. b != 0이므로 false 실행. b++실행

 

728x90
반응형
728x90

 

 

연산자(operator)

1.단항연산자

2.다항연산자

1+1에서 1하나가 1항

 

1.단항연산자

1)논리부정연산자

2)증감연산자

 

1)논리 부정연산자 : !

not으로도 부름

논리를 프로그램에서는 true/false를 말하며, 부정의 의미는 뒤집어 놓는다

true면 false로 false면 true로 값을 뒤집는 단항연산자

!false = true

!true = false

 

2)증감연산자 : ++, - -

피연산자의 값을 1 증가/감소시키는 연산자(operator)

-고정된 값 1씩만 증가/감소된다

-앞에 붙으면 전위 증감연산자(=전치) : 자신의 연산(++뜻함) 먼저하고 다른 연산 진행

-뒤에 붙으면 후위 증감연산자(=후치) : 다른 연산 먼저하고 자신의 연산(++뜻함) 진행

ex)

int a =3;
int b = 3;
int c = ++a; // 전위 : a는3. ++의 계산 먼저니, 1+3=4하고 c로 넘어가는 대입연산자가 나중에 연산됨
int d = b++; // 후위 : b는3. ++의 계산이 후니, 3인 b가 대입연산자 연산 먼저해서 d에 3이 들어가고 b는+1되서 4. 후에 출력해보면 b는 4나온다 

 

전위

a는3. ++의 계산 먼저니, 1+3=4하고 c로 넘어가는 대입연산자가 나중에 연산됨

후위

b는3. ++의 계산이 후이니, 3인 b가 대입연산자 연산 먼저해서 d에 3이 들어가고 b는+1되서 4. 후에 출력해보면 b는 4나온다

*후치의 경우 계산 적용이 나중이기 때문에 출력이나 값에 반영되는게 느리므로 주의

 

 

*후치 다른연산 먼저라는게 범위가 어디까지?

코드 한줄 기준 가장 마지막

 

 

문제 연습

package com.kh.operator;

// 증감 연산자
// 1.단항 연산자
// 2.다항 연산자
public class B_InDecrease {

		// 1.단항연산자
	public void method1() {
		// 1)전위 증감 연산자
		int num1 = 10;
		System.out.println("전위 증감 연산자 적용 전 : " + num1);		  // 10	
		System.out.println("++num1을 1회 수행 후 결과 : " + ++num1); 	// 11
		System.out.println("++num1을 2회 수행 후 결과 : " + ++num1);	  // 12
		System.out.println("++num1을 3회 수행 후 결과 : " + ++num1);  	// 13
		System.out.println("++num1을 4회 수행 후 결과 : " + ++num1);	  // 14
		System.out.println("++num1을 5회 수행 후 결과 : " + ++num1);  	// 15
		System.out.println("++num1을 5회 수행 후 결과 : " + (++num1)); // ++을 ()로 묶어도 괜찮
		System.out.println("후위 증감 연산자 적용 후 : " + (++num1));	    // 15  
	
		// 2)후위 증감 연산자	
		int num2 = 10; 
		System.out.println("후위 증감 연산자 적용 전 : " + num2);			// 10
		System.out.println("num2++을 1회 수행 후 결과 : " + num2++);	 // 10 출력은 10이나 실제값은 11
		System.out.println("num2++을 2회 수행 후 결과 : " + num2++);	 // 11
		System.out.println("num2++을 3회 수행 후 결과 : " + num2++);	 // 12
		System.out.println("num2++을 4회 수행 후 결과 : " + num2++);	 // 13
		System.out.println("num2++을 5회 수행 후 결과 : " + num2++);	 // 14
		System.out.println("num2++을 5회 수행 후 결과 : " + (num2++)); // ++을 ()로 묶어도 no prob
		System.out.println("후위 증감 연산자 적용 후 : " + num2++);	    // 15  
	}
	
	public void method2() {
		int num1 = 20;
		int result1 = num1++ * 3;					// 후치
		System.out.println("result1 : " + result1);	// 20*3=60 : 대입연산자로 대입되고 변수값 출력되고 후에 +1되기에 출력에 +1 미반영
		System.out.println("num1 : " + num1);		    // 21 : 위 계산 후 +1된 상태가 반영되서 출력값21
		
		int num2 = 20;
		int result2 = ++num2 * 3;					// 전치
		System.out.println("result2 : " + result2);	// 20+1=21*3=63
		System.out.println("num2 : " + num2);		    // 21 : 20+1된게 반영되서 21
		 
	}
	public void method3() {
		int a = 10;
		int b = 20;
		int c = 30;
		
		System.out.println(a++);// 10
		// a=11 b=20 c=30
		System.out.println((++a) + (b++));	// 32
		// 					         12 		20
		// a=12 b=21 c=30
		System.out.println((a++) + (--b) + (--c));// 61
		//					        12		  20   		29
		// a=13	b=20 c=29
		
		System.out.println(a);	// 13
		System.out.println(b);	// 20
		System.out.println(c);	// 2
	}
}
728x90
반응형
728x90

 

스캐너(Scanner)

Scanner sc = new Scanner(System.in);

System.in : 컴퓨터 자체 표준입출력

          키보드 입력값을 받아오기 위한 명령어. 키보드 한정.

System.out : 콘솔(결과 나오는 창. 이 중 하나의 도구가 모니터) 에다 출력하기 위한 표준출력

 

 

문자

nextLine() : 문자/문자열을 받아옴

   -다른 next는 값만 가져오지만 얘만 줄바꿈도 같이 버퍼에서 끌어온다

next() : : 문자/문자열을 받아옴

 

숫자

nextInt() : 정수 int 받아옴

nextlong() : 정수 long 받아옴

netxFloat() : 실수타입 float 받아옴

nextDouble() : 실수타입 double 받아옴

 

키보드 입력이 들어오면 값을 받아 버퍼(Buffer) 임시저장공간에 잠깐 저장됨

nextLine()은 받아온 값(값\n(줄바꿈))을 전체 다 인식 -버퍼에는 값이 안남음. 값을 전체 다 인식해서 넘기기기에.

next()는 받아온 값(값\n) 중 실제 데이터만 인식 -딱 값만 가지고간다 -버퍼에는 \n(줄바꿈)이 남아있음

 

 

스캐너 사용시, 입력도 안했는데 값이 넘어가는 이유

콘솔창에서 address가 입력이 안됨

System.out.print("이름를 입력하세요 : ");
String name2 = sc2.nextLine();
System.out.print("나이를 입력하세요 : ");
int age2 = sc2.nextInt();

System.out.print("주소를 입력하세요 : ");
String address2 = sc2.nextLine();**	// 결과값에서 address가 입력이 안됨

System.out.println(name2+"("+age2+")"+"님이 사시는 곳은 "+address2+"입니다.");

키보드 입력 강건강 엔터치면 강건강\n까지 입력됨

버퍼 공간에 강건강\n까지 입력됨

nextLine()은 강건강\n 전체를 다 가지고가서 버퍼에 남는게 없음

String name = sc.nextLine();의 넥스트 라인에 강건강\n이 들어가있는 상태

.nexline()에서 변수 name으로 넘어갈 때 강건강만 넘어가고 \n는 짤려서 안넘어감

 

해결방법 3가지

  1. 주소를 next()로 받아오기
  2. nextLine()을 추가하기
  3. 엔터가 남지 않도록 나이를 받을 때, nextLine() 받은 후 parsing하기

 

해결방법1

Scanner sc2 = new Scanner(System.in);
System.out.print("이름를 입력하세요 : ");
String name2 = sc2.nextLine();
System.out.print("나이를 입력하세요 : ");
int age2 = sc2.nextInt();
System.out.print("주소를 입력하세요 : ");
String address2 = sc2.**next();**

해결방법2

Scanner sc2 = new Scanner(System.in);
System.out.print("이름를 입력하세요 : ");
String name2 = sc2.nextLine();
System.out.print("나이를 입력하세요 : ");
int age2 = sc2.nextInt();
**sc2.nextLine();** // 중간에 넥스트라인 추가로 \\n의 찌꺼끼를 패스시킴 
System.out.print("주소를 입력하세요 : ");
String address2 = sc2.nextLine();
System.out.printf("%s(%d)님이 사시는 곳은 %s입니다.", name2, age2, address2);

 

해결방법3

parsing : 문자열을 데이터타입 기본형(primitive) 으로 바꾸는 것

Scanner sc2 = new Scanner(System.in);
System.out.print("이름를 입력하세요 : ");
String name2 = sc2.nextLine();
System.out.print("나이를 입력하세요 : ");
String strAge = sc2.nextLine();
int age2 = Integer.parseInt(strAge); // (strAge)를 parsing 하고 나온 것을 변수에 넣어야함
System.out.print("주소를 입력하세요 : ");
String address2 = sc2.nextLine();

 

728x90
반응형
728x90

 

상수(Constant)

한번만 저장할 수 있는 변수

변하지 않는 변수

상수명 네이밍시, 전부 대문자 and 단어 사이는 언더바( _ )

final boolean **IS_FALSE** - false;

예약어(reserverd word) final 추가

public class B_Constant {
public static void finalConstant() {
	int age = 10;
	final int AGE = 10;
	
	System.out.println("age : " + age);
	System.out.println("AGE : " + AGE);
	
	age = 20;
//		AGE = 20; // 상수라 값 변경불가
	// error : The final local variable AGE cannot be assigned. 
	// It must be blank and not using a compound assignment
	
	System.out.println("age : " + age);
	System.out.println("AGE : " + AGE);
}
}

 


 

형변환(Casting)

자료형을 바꾸는 것

(boolean은 형변환 불가)

1)자동 형변환

2)강제 형변환

 

 

 

8byte long에서 4btye float로 변환될까?

가능. 정수보다 실수가 범위가 더 넓어서 가능.

바이트에 대한 상자크기

int a = 10;

int b = 10L; error

8byte인 long을 4byte인 int에 넣을려고 해서 에러

 

 

문자인 char를 숫자로 casting?

아스키코드에 char에 대한 숫자 변환 값이 나와있다.

숫자에서 char로도 변환가능

유니코드 : 아스키코드 확장형

 

1)자동형변환

int a = 12;

double d = 3.3;

데이터타입이 다른 int와 double의 계산?

일단가능

 

a+d의 데이터 타입은

자료형이 맞지 않으면

작은 크기 의 데이터값이 자동으로 형변환이 됨

 

short result = s + c ;

char result = s +c ;

 

float to long 형변환? 가능

작은거에서 큰거

큰거에서 작은거 둘 다 가능하나

// 1.자동 형변환
public void cast1() {
// 	 1)정수끼리 자동 형변환
	byte bNum = 3;
	int iNum = bNum; // 자동 형변환
//	 2)정수와 실수끼리의 자동 형변환
	long lNum = 100;// long으로 int로 자동 형변환
	byte b1 = 10;	// 4byte 정수 10 // byte 크기가 안맞는데, no error? byte저장 가능범위 : -128~127
//		byte b2 = 10L;  // 8byte 정수 10 // 1byte인 b2에 8byte짜리를 넣을려해서 error
					// byte의 저장 가능 범위(-128~127)를 넘어섰기에 에러
					// 리터럴. 값 유동적일 수 있음. int가 4byte이긴 하지만 리터럴이기 때문에 
					// 내가 받을 수 있는 범위 안에 들어오느냐를 먼저 확인해 볼 수 있음. 변수가 아니기에 각 데이터별 범위 안에만 있으면 허용가능
					// 각 데이터타입이 받을 수 있는 범위(변수 저장가능범위)부터 체크 데이터 타입 체크
//   3)정수와 문자끼리의 자동 형변환
	int num = 'A';
	char ch = 97;
	System.out.println("num : " + num);
	System.out.println("ch : " + ch);
	
//		char ch2 = num; // error :Type mismatch: cannot convert from int to char
	char ch2 = (char)num; // 강제 형변환 
	// 위에서 int num = 'A'는 잘run되고 결과값65를 얻었는데 왜 안될까?
	// 'A'는 리터럴이고 num은 변수. 리터럴이기에 변수저장 가능범위가 맞으면 형변환이 가능했던 것
	System.out.println("ch2 : " + ch2);
	
	int num1 = -10;
	char ch3 = (char)num1;
	System.out.println("ch3 : " + ch3); // 아스키코드 변환 ?가 아닌 어떤 문자로 매치될지 진짜 몰라서 나오는 ?

}

 

 

2)강제 형변환

크기가 큰 자료형이 크기가 작은 자료형으로 변환

강제 형변환시 데이터 손실이 발생할 수 있음

1btye = 8bit

8비트에서 16비트로 변환하면 남는 메모리 값(칸)을 0으로 채우면 되지만, 반대로 16비트에서 8비트로 줄어 들 때는 못집어 넣는 값이 생기면서 데이터 손실이 발생할 수 있음

강제 형변환은 자동으로 데이터 손실 가능성 때문에 잘 형변환 시키지 않는다.

int a = 12;
double d = 3.3;
int result = a + (int)d; // 강제 형변환

int i = (int)d; 

System.out.println(i);       // 결과값 3
System.out.println(result);  // 결과값 15
// 2.강제 형변환
public void cast2() {
	int iNum = 10;
	long lNum = 100L;
	
//		int result = iNum + lNum;	// 작은게 큰거를 따라감. int가 long으로 자동변환 되는데 담기는 그릇이 int라 error
	// iNum이 long으로 자동 형변환이 되어 계산 결과가 long타입이 되는데 그 값을 int에 넣으려하기 때문
	
	
	// 방법1. 수행 결과를 int로 강제 형변환
	int result1 = (int)(iNum + lNum);	// 계산순서 1. (iNum + lNum) 2. (int) 형변환
	
	// 방법2. long형 값을 int로 강제 형변환
	int result2 = iNum + (int)lNum;
	
	// 방법3. 결과값을 long형의 자료형으로 받기
	long result3 = iNum + lNum;
}

 

 

※ 컴퓨터의 연산의 원칙

  1. 같은 종류의 자료형 대입 가능
  2. 같은 종류의 자료형 계산 가능
  3. 같은 종류의 자료형 결과 도출

 

 

728x90
반응형
728x90

 

실행클래스 & 기능 클래스

실행 클래스 : 메인메소드. 전원 on/off 버튼 역할

기능 클래스 : 불러와지는 클래스. 실제 내용이 담긴 클래스

 

실행클래스

Run이라 지어진 이 클래스는 해당 기능을 가진 메소드를 실행하기만 실행 클래스이다

메인메소드가 들어가서 실행할 수 있게 해준다

 

 

 

기능 클래스

실제 기능을 담고 있는 클래스. 해당 클래스에서는 실행하는 기능은 없다.

객체지향 5대 원칙 SOLID 중 SRP인 클래스에 하나 기능 원칙도 추가도 잊지말자

 

 

 

728x90
반응형
728x90

 

변수란?

하나의 값을 저장할 수 있는 공간

메모리에 값을 저장할 수 있는 공간

변수는 상자

*전역변수 = 멤버변수 = 멤버필드 = 필드 : 클래스영역에 작성하는 변수

 

변수의 선언이란?

메모리 공간에 데이터를 저장할 수 있는 공간을 할당하는 것

변수의 선언 : stack에 뭔가 공간에 잡히는 것

  • stack : 컴퓨터가 사용하는 영역
  • heap :개발자가 사용하는 영역
  • static : 공용으로 사용할 수 있는 공간

선언하다 : stack에 변수명의 공간이 잡히는 것

int age; // 선언하면 stack에 4byte짜리(int 공간) 공간하나가 생긴다

값을 대입한다 : 변수에 값 저장

초기화 : 변수에다 값을 처음 넣는 것. 객체 선언을 하고 값을 최초로 할당하는 것

변수의 값 대입

대입연산자(=)**를 이용하여 오른쪽에 있는 값(리터럴)을 왼쪽에 넣는다(변수)

 

데이터타입 2가지

1.기본형(primitive)

  • boolean(논리), char(문자), String(문자열),
  • byte, short, int, long // double, float

2.참조형(non-primitive)

 

접미사

대소문자 모두 가능하나 관용적으로 long의 L은 대문자로

long = 0L

float = 0f

double = 0 또는 0d

 

위의 자료형명대소문자 구분 확실히!

-Double 대문자면 클래스로 쓰일 수도 있어 완전 쓰임새가 달라짐

 

int가 정수형의 기본이 된 이유

    - 4byte가 컴퓨터가 계산하기 좋은 크기라서라고 함

double이 실수형의 기본이 된 이유

    - 소수점이 있는 실수를 정확하게 계산할 수 없음(오차발생 필연적). 부동소수점. 최대한 오차를 줄이기 위해 double이 8바이트지만 기본형이 됨.

 

 


 

변수 명명규칙

(클래스명에도 적용됨)

1.대소문자 구분되며, 길이 제한이 없다

길이 제한이 없는 이유 :예약어(reserved word) 때문

 

2.예약어(reserverd word)를 사용하면 안된다

ex) true, final, String 등

 

3.숫자로 시작하면 안된다

ex)age1은 가능하지만 1age불가

 

4.특수문자는 ‘_’와 ‘$’만을 허용한다

-’$’는 내부 클래스에서 사용

-’_’ 사용 시 컴파일 에러는 없지만 관례상 사용하지 않는 것이 좋음

ex)sh@rp는 불강하지만 $harp는 가능

 

5.여러 단어 이름은 단어의 첫글자를 대문자로 한다

(단, 첫 시작 글자는 소문자로 하는 것이 관계)

ex)ageOfVampire,userName

 

클래스명 첫글자 대문자

세미콜론( ; )의 의미 : 한문장의 마침을 알림

 

 

 

※ 변수, 인자, 매개변수 구분

  • 변수 인자 매개변수 구분인자는 값을 넣는 쪽
  • 파라미터는 값을 받는 쪽
  • 각각 변수의 종류

 

728x90
반응형
728x90

 

1)charAt ()

charAt(int index):char

받는 데이터의 원하는 인덱스번호의 자리 문자 하나를 반환

2) concat()

concat(String str):String

원래 문자열 끝에 매개변수로 들어온 값을 이어붙인 문자열 반환

3) equals()

equals(Object anObject):boolean

4)substring()

substring(int beginIndex):String

해당 인덱스 넘버부터 문자열 시작

substring(int beginIndex, int endIndex):String

5)replace()

replace(char oldChar, char newChar):String

A to B 사이의 문자열 일부 반환

public class practice_everyday01 {
	public static void main(String[] args) {	
		
		// String methods
		String str = "힘을 내라";
		
		// 1)charAt ()
		// charAt(int index):char
		char cheer = str.charAt(0);
		System.out.println("1."+cheer); // 힘
		
		// 2) concat()
		// concat(String str):String
		// 원래 문자열 끝에 매개변수로 들어온 값을 이어붙인 문자열 반환
		String cstr = str.concat(" cheer up");
		System.out.println("2."+cstr);
		
		
		// 3) equals()
		// equals(Object anObject):boolean
		System.out.println("3."+str.equals("equal"));
		
		// 4)substring()
		// substring(int beginIndex):String
		// 해당 인덱스 넘버부터 문자열 시작
		// substring(int beginIndex, int endIndex):String
		// A to B 사이의 문자열 일부 반환
		
		System.out.println("4.1."+str.substring(0,3));
		System.out.println("4.2."+str.substring(2));
		
		
		// 5)replace()
		// replace(char oldChar, char newChar):String
		
		System.out.println("5."+str.replace('힘','손'));
	}	
}
728x90
반응형
728x90

 

StringBuffer & StringBuilder 클래스는

불변 클래스인 String 클래스랑 다르게 문자열 수정이 가능한 가변 클래스다

 

String이 수정이 불가능하다니 무슨 말일까?

String 타입의 변수에 값을 넣어보면 언제든 바꿀 수 있는걸 알 것이다. 근데 사실 이게 데이터 자체가 수정되는게 아니라 시스템 내부에서는 String 타입의 변수에 값이 들어오면 메모리에 새로운 공간과 주소값을 생성시키고 기존의 것을 삭제하고 대체하는 식으로 작동한다. 그럼 주소값도 달라지고 눈에 보이는건 수정된 걸로 보이지만 말이다. 근데 이 둘 StringBuffer & StringBuilder은 말그대로 데이터 자체를 수정시킨다. 주소값 변함없이.

 

String 클래스와 이 둘의 차이

 - String : 변경이 적고 읽기만 많은 경우에 유리. 수정불가.

 - StringBuffer & StringBuilder : 문자열에 대한 수정이 많이 일어나는 경우 유리. 수정가능.

 

StringBuffer & StringBuilder의 차이는?

StringBuffer 동기화 o / 상대적으로느림 / 안전

StringBuilder 동기화 x / 빠름

둘이 동기화처리 빼고는 기능이 모두같다

동기화가 들어가면 상대적으로 안전하다. 데이터에 대해 락을 걸어놓고 진행하기에 처리속도가 상대적으로 느릴 수 있고 동기화가 안들어가면 락이 없어 그마만큼 속도가 다소 빠르다.

 

StringBuffer & StringBuilder

메모리 관리를 위해 에전에는 String대신 쓰기도 했다고 하나 요새는 성능들도 많이 좋아지고 String을 대개 많이쓴다고한다. 퍼나빌더를 쓴다고 눈에띄게 빨라지는게 아니라고 한다. 또한 자동으로 수용량(capacity)가 증가한다.

 

 

StringBuffer 안에 쓸 수 있는 많이 쓰는 메소드들

1) append()

받아온 값을 뒤에 추가로 이어주는 메소드

 

2) insert()

원하는 자리에 값 추가 시킬 수 있는 메소드

 

3) delete()

데이터 삭제하는 메소드

delete(int start, int end) : StringBuffer

deleteCharAt(int index) : StringBuffer

 

4)reverse()

앞뒤 거꾸로 값을 바꿔놓는 메소드

 

728x90
반응형
728x90

1. hashCode()

hashCode() : int ← 매개변수x 주소값 반환

Returns a hash code for this string.

주소값을 보기 위해 사용하는 코드

객체의 주소값을 해시코드로 구현한 결과값

 

2. identityHashCode()

System.identityHashCode(변수명)

실주소값을 연산해놓은 결과값을 도출하는 메소드

 

728x90
반응형

+ Recent posts