본문 바로가기

신세계 국비과정/신세게 - Java 공부

2주차 배운점 느낀점 - 배열, String, 메모리영역

728x90
반응형

 

 

2주차도 열심히

 

정신없는 1주일이 지나고 2주차가 시작했다. 오늘 참조타입 변수에는 배열, 열거, 클래스, 인터페이스가 있다. 각각의 메모리에 저장되는 영역에 대해 배웠다. 과거에 학생때 공부할때 외웠던 기억이 있다. 기억을 더듬으며 수업에 임했고, 어디어디 저장되는지 개념을 확실히 하게된 계기가 되었다. JVM은 항상 바쁘게 많은 일을 하는것 같다.
아직 java의 기본개념을 배우고 있다. 다시 한 번 개념을 훑을 수 있어서 나에게 많은 도움이 되고 있다. 또 '정올' 사이트에서 문제풀기 과제가 많은데, 이 또한 내 코딩실력 다지는 좋은 습관을 가지게되었다. 양이좀많긴하지만 . .
현업 경험한 개발자, 전공자, 비전공자가 공존하는 여기는 혼돈이다. 전직 개발자에겐 도움을 받고 비전공자에게 내가 알려줄 수있는 중간 포지션같다. 배울점이 참많다.

 

배운점

 

참조타입: 객체의 번지를 참조하는타입
배열, (enum)열거, 클래스, 인터페이스 타입

 

 

객체:
데이터와 메소드로 구성된 덩어리 = 데이터(필드) + 메소드

 

클래스: 데이터를 위한 데이터타입
기능에 대한 상속, 확장성을 이용,제공하기위한 타입, 상수값 다 들어감, 다형성

 

Object 객체는 자동으로 상속되어 있다.

 

JVM은 운영체제에서 할당받은 메모리 영역을 메소드 영역, 힙영역, 스택영역으로 구분해서 사용한다.

 

힙영역: 객체가 생성되는 영역, 객체의 번지는 메소드, 스택, 영역에서 상수와 번수를 참조
스택영역: 메소드를 호출할때마다 생성되는 프레임이 저장되는 영역

 

static 함수는 static 끼리 사용할 수 있다.
static 없이 사용하려면 클래스를 만들어주어야함
클래스나 static 이나 메소드 영역이다.
public class Test{
static Scanner sc = new Scanner(System.in);
-> 메인 밖에서 생성, 메인에서 사용가능, 클래스 전역에서 사용가능
public static void main( ...

 

리터럴 풀:
리터럴(10, 3.14, true, "String", 'A')... 저장되는 공간

 

스트링 비교

name.equals(name2) -> true

 

String name = "java"
name.hashCode(); -> jvm이만든 해쉬코드값

 

String name1 = "java";
String name2 = "java";
name1.hashCode() == name2.hashCode() -> 같은 스트링 값

 

String 리터럴 같은게 들어오면 상수가 들어오면 기존 만들어 졌던건지 검사함 -> 메모리 절약

 

 

메소드영역(Methode area)
바이트코드(클래스 파일) 읽어 저장하는 영역
클래스 별로 상수, 정적 필드, 메소드 코드, 생성코드 등 저장
바이트코드(클래스) 이름으로 구분, 위치 이름 대소문자 다르면 못 찾는다.

 

힙영역(Heap area)
객체 인스턴스 되어진 상태 저장 공간
객체가 생성되는 영역(객체의 데이터만 저장)
객체의 번지는 메소드 영역과 스택 영역에서 참조
인스턴스: 클래스가 실체화된 상태, 메모리를 할당 했다. new 사용
객체, 인스턴스 힙영역에서 다뤄짐

 

스택영역(Stack area)
메소드 불러질 때마다 , 프레임 영역이 생긴다.
frame이 저장되는 영역
메소드 호출이 끝나면 해당 프레임이 삭제된다 (pop)
프레임 내부에는 로컬변수 스택이 생성되어 운영된다.
로컬변수 스택에서 기본타입변수와 참조 타입 변수가 생성되고 제거됨
main, childhood(<-따로 만든 static 메소드)
다 끝나면 팝, 프레임 단위
이 전체는 프레임 단위로 실행됨, 스레드 끝나면 0 호출->jvm 종료
인스턴스는 스레드로 가져온 것

 

번지비교 : ==, !=

 

ctrl+d :줄 복사

 

NullPointerException
null값 참조타입 변수는 아직 번지를 저장하지 않다는 뜻
null도 초기값으로 사용할 수 있기 때문에 null로 초기화된 변수는 스택영역에 생성

 

int[] array = null
System.out.println(array) -> null출력
array[0] = 10 ; -> 널포인터이셉션, 주소값 할당 안하고 뭐로 하라는거야??

 

가비지컬랙터
array = null -> 주소를 못 찾아감, 힙에는 데이터 남아있음
gcc(가비지 컬랙터)가 지워줌

 

배열 비교
array.toString() -> 실제 주소값
array.hashCode() -> jvm이 만든 코드값
String kind1 = kind2; -> 주소가 같아짐

 

String var1 = "홍길동";
String var2 = "홍길동";
리터럴 풀로 문자열 관리: 같은 문자열 할당시 메모리 재사용을 위해 참조가 같다.

 

String str1 = new String("홍길동");
String str2 = new String("홍길동");
new 연산자 생성함
HashCode는 같게 나옴, 둘다 참조 다르다.
.equals 내용물 비교는 같다.

 

주소값
System.identiHashCode(strVar1) -> 2003749087..
실제 주소값 10진수로 나타남
toString() -> 16진수로 나타남

 

인헨스드 포(enhanced for)
for(int i : intArray){
System.out.println(i);
}
for(String s : season){
System.out.println(s);
}

 

Arrays.stream
int totalValue = Arrays.stream(score).sum(); -> 배열 합계 출력
double average = Arrays.stream(score).average().orElse(0.0); -> 평균 출력

 

2차원 배열 길이
int[][] score = {{90,80,70,},{70,60,65}};
score.length -> 2
score[0].length -> 3

 

문자열 추출 :
charAt(0)

 

문자열 길이:
.length()

 

배열: 연속된 공간에 값을 나열시키고, 각 값에 인덱스를 부여해 놓은 자료구조
인덱스 [] 와 함께 사용 -> 값 읽기, 저장

 

배열은 heap에 생성되기 때문에 new 연산자 필요함

 

참조할 배열이 없다면 null로 초기화 가능

 

배열변수 선언한 시점과 값 목록이 대입되는 시점이 다르다면 new 타입 {} 앞에 사용해 주어야 한다.

타입[] 변수 = new 타입[길이];

 

회고

 

과제 따라가기가 급급하다. 스터디 조 그룹을 만들었다. 일주일에 한 번씩 모임을 가지고 각자 문제를 풀고 코드리뷰와 os 에 대한 공부를 한 후 발표하기로 했다. 아직 구체적이게 정해진 것은 없지만 자발적인 이런 스터디는 환영이다. 나의 지식을 발전 시킬 수있고 발표능력도 향상될 것이다. 팀원들과 열정을 불태우고 싶다.

반응형