- 인스턴스(객체): 생성된 객체를 인스턴스라고 칭한다.
- 클래스: 클래스를 이용해 힙 영역에 새로운 인스턴스를 만들 수 있다.
- 인스턴스를 생성하면 서로 독립적인 메모리를 할당 받는다.(Static)
//예제
public static void main(String[] args){
String a ="123";
String b = new String("abc");
}
a와 같이 문자열 리터럴 방법으로 생성하면 문자열 상수 풀에 문자열이 저장된다.
b와 같이 New 키워드로 생성하는 경우, 인스턴스가 Heap 메모리 영역에 저장됨.
이때 문자열이 같더라도 힙 영역에 여러개가 생성 되어 다른 참조 값을 가짐
문자열 상수풀?
-> Java 힙 영역에 존재하는 특수한 공간으로, 문자열 리터럴을 저장하는 용도로 사용된다.
문자열 리터럴이 생성될 때마다 JVM은 해당 문자열이 문자열 상수 풀에 존재하는지 확인함
public static void main(String[] args){
String a = "Hello"
String b = new String("Hello");
String c = new String("Hello");
}
- Length: 현재 문자열 길이 반환
- Equals: 두 문자여링 같은지 비교 후 결과 반환
- charAt: 해당 문자열의 index 위치에 있는 문자 한 개 반환
- SubString: 프로그래머가 지정한 위치의 문자열 반환
public static void main(String[] args){
String a = "1234567"
System.out.println(a.length()); // length 예제
System.out.println(a.equals("123")); // equals 예제
System.out.println(a.charAt(2)); // charAt 예제
System.out.println(a.subString(1,4)); // subString 예제
}
7
False
3
234 // 1 ~(4-1)위치의 문자열 반환
코드영역: 실행할 프로그램의 코드를 올려 놓을 공간
데이터 영역: 프로그램이 종료될 때까지 유지해야 할 데이터를 저장할 공간
전역변수 & Static 변수는 이곳에 저장됨
힙 영역: 사용자에 의해 동적으로 할당되고 해제되는 메모리 영역
스택 영역: 함수 호출 시에 생성, 함수 호출이 완료되면 사라짐
기본 자료형은 스택 영역에 실제 값을 저장
배열 변수는 참조 변수에 속함 -> 배열 변수는 Stack 영역에 저장됨.
배열도 객체이므로 힙 영역에 생성
배열 변수는 힙 영역의 배열 객체 참조
int [] intArr = new int[5];
public static void main(String[] args){
String[] strArr = new String[3];
strArr[0] ="Java";
strArr[1] ="Java";
strArr[2] = new String("Java");
System.out.println(strArr[0]==strArr[1]);
System.out.println(strArr[0]==strArr[2]);
System.out.println(strArr[0].equals(strArr[2]));
}
True
False
True
자바에서 문자열을 ==
연산자로 비교하면, 두 개의 문자열이 메모리 상의 동일한 객체인지 비교.
- 동일한 문자열 리터럴를 참조하는 0,1을 비교하는 문장은 True
- New 키워드를 이용하면 새로운 객체를 생성하므로 False
- Equals는 메모리가 아닌 문자열을 비교하므로 True
기본 타입 배열과 참조 타입 배열의 차이점
- 기본 타입 배열: 각 항목에 직접 값을 가짐
- 참조 타입 배열: 각 항목에 객체의 메모리 주소를 가짐
EX) String 배열의 항목도 String 변수와 동일하게 취급 되어야 함
1. 배열
2. ArrayList
- 객체 배열을 구현한 클래스
- 리스트의 길이가 가변적(동적 할당)
- 데이터 사이 빈 공간 허용X
ArrayList<타입> 객체명 = new ArrayList<>();
Wrapper 클래스: 기본 자료타입을 객체로 다루기 위해 사용하는 클래스들
'
기본 타입(primitive type) 래퍼 클래스(wrapper class) byte Byte char Character int Integer float Float double Double boolean Boolean long Long short Short // 예제 public static void main(String[] args){ Integer num = new Integer(17); // 박싱 int n = num.intValue(); // 언박싱 }
🥚 입력
public static void main(String[] args){
ArrayList<String> str = new ArrayList<>();
str.add("ralo");
str.add("chanho");
str.add(1,"paka");
System.out.println(str.get(2));
System.out.println(str.indexOf("chanho"));
}
🍳 출력
chanho
2
다른 프로그래밍 언어에서 '함수'라고 불리는 것
반복되는 작업을 메서드를 통해 효율적으로 처리하기 위함
- 매개변수: 메서드에 전달된 값을 저장하는 변수
- 인수: 메서드에 전달하는 값
int sum(int a, int b){return a+b;}
void Say(){System.out.println("Hello");}
String Say(){return "Hello";}
void sum(int a, int b)
{
System.out.println("a+b="+(a+b));
}
public class Sample(){
void sayNick(String nick){
if("fool".equals(nick) return;
System.out.println("나의 별명:"+nick);
}
public static void main(String[] args){
Sample s = new Sample();
s.sayNick("angle");
s.sayNick("fool"); // 출력되지 않음
}
}
전역 변수:데이터 영역 에 저장
지역 변수: 스택 영역 에 저장
Static 변수: 데이터 영역 에 저장
데이터 영역: 프로그램이 종료될 때 까지 유지해야 할 데이터 저장할 공간
스택 영역: 함수 호출시 생성 & 호출이 종료되면 사라짐
class Ex_variable{
int global; // 전역 변수(객체 변수): 같은 클래스에서 호출 가능
void method(){
int local = 0; // 지역 변수: {} 안에 생성 되며, {}를 벗어나면
} // method() 메서드가 끝나는 시점에서 바로 삭제
void print(){
System.out.println(global);
System.out.println(local); // 에러
}
}
자바에서 Static 키워드를 사용한다는 것은 메모리에 한 번 할당되어
프로그램이 종료 될 때 해제됨을 의미.
# Static 변수 특징
- 클래스 변수, 객체에 소속된 멤버가 아닌 클래스에 고정된 멤버
- 객체를 생성하지 않아도 Static 차원에서 접근 가능
- Static
- 주로 클래스 들이 할당
- Garbage Collector 관여 X
- 모든 객체가 메모리 공유
- Heap
- 주로 객체 들이 할당
- Garbage Collector 관여 O
- 메모리 공유 X
🥚 입력
public class LikeCount{
int count=0;
static int sCount=0;
public LikeCount(){
this.count++;
this.sCount++;
System.out.println("count:"+count);
System.out.println("sCount:"+sCount);
}
public static void main(String[] args){
LikeCount lc1 = new LikeCount();
LikeCount lc2 = new LikeCount();
}
}
🍳 출력
count:1 // lc1
sCount:1 // lc1
count:1 // lc2
sCount:2 // lc2
- 메서드 호출 시에 인자로 전달되는 값의 복사본 전달
- 메서드에서 인자의 값이 변경 돼도 호출된 측에서는 원래 값 유지
- 객체의 주소값이 인자로 전달
- 메서드 인자의 값이 변경되면 호출된 측에서도 변경된 값 사용
public class Main{
// Call By Value
public satatic void increment(int num)
{ num++; }
// Call By Reference
public static void changeAge(Person person)
{ person.setAge(person.getAge()+1); }
public static void main(String[] args){
int x =5;
increment(x);
System.out.println("x: "+x); // 출력: x: 5
Person person = new Person("John",30);
chageAge(person);
System.out.println("age: "+person.getAge()); //출력: age: 31
}
}
자바에서 입력을 위해 제공해 주는 클래스
Scanner 객체 이름 = new Scanner(System.in);
Scanner 클래스 메서드 | 기능 |
---|---|
next() | 문자열 입력(띄어쓰기 X) |
nextLine() | 문자열 입력(띄어쓰기 O) |
nextByte() | byte 타입 자료형 값 입력 |
nextInt() | int 타입 자료형 값 입력 |
nextBoolean() | boolean 타입 자료형 값 입력 |
nextShort() | short 타입 자료형 값 입력 |
nextLong() | Long 타입 자료형 값 입력 |
nextFloat() | float 타입 자료형 값 입력 |
nextDouble() | double 타입 자료형 값 입력 |