복습

자바 8일차 - Static(클래스)메서드, 배열, 배열복사, 향상된 for문 본문

자바

자바 8일차 - Static(클래스)메서드, 배열, 배열복사, 향상된 for문

ykm1256 2020. 3. 30. 02:32

Static(클래스) 메서드

만약에 static(클래스)메서드에서 static이 아닌 일반 멤버변수에 접근하려고 하면 오류발생. 멤버변수는 클래스가 생성되어야 사용할 수 있기 때문

 

 

package StaticEx;
public class StudentTest4 {
public static void main(String[] args)
에서 메인함수에 static은 메인 함수가 클래스안에 소속되어 있지만 그 클래스는 객체로 만들어 지지 않기 때문에 static을 써줘야 자바가상머신이 사용할 수 있고,  public을 붙여 같은 패키지가 아닌 자바 가상머신이 접근할 수 있게 한다.

 

변수 유효 범위 
지역 변수 - 함수 내부에 선언, 사용. 스택에 저장되고 함수가 호출될 때 생성되고 끝나면 소멸
멤버 변수 - 클래스 멤버 변수로 선언하고 클래스 내부에서 사용하며 private이 아니면 참조 변수로 다른 클래스에서 사용가능. 힙에 저장되고 인스턴스가 생성될 때 힙에 생성되고 가비지 컬렉터가 메모리를 수거할 때 소멸됨.
static 변수 - 클래스 내부에 선언하고 클래스 내부에서 사용하며 private이 아니면 다른 클래스에서도 사용 가능. 데이터영역에 저장되고 프로그램이 시작할 때 생성되고 끝날때 소멸됨.

 

싱글톤패턴 : 인스턴스를 단 하나만 생성하는 디자인 패턴

 

배열
자료형[] 배열이름 = new 자료형[개수];
자료형[] 배열이름 = {배열}
자료형[] 배열이름 = new 자료형[] {배열}
배열번호는 0 ~ 크기-1

 

객체 배열

Book[] lib= null; -> 스택에 배열참조변수 lib가 만들어지는데 쓰레기값이 들어가므로 null을 넣어준다.

lib = new Book[5]; -> 배열참조변수의 객체 배열이 생성된다.  여기는 실제 값이 들어있는 배열의 주소값이 들어있다.

ib[0] = new Book("태백산맥", "조정래"); -> 이제서야 Book객체가 만들어지고 값을 대입한다. 각각의 객체들이 배열처럼 동작하지만 실제로는 주소값이 들어있는 곳이 배열이고 객체는 배열처럼 붙어있지는 않다.

*오른쪽 사진에서 주석처리된 코드를 위의 2줄의 코드로 변경하여 썼을 때 오류가 발생했었다. 계속 고민한 끝에 Bookname, Author은 일반 멤버변수이므로 객체가 생성되지 않으면 사용할 수 없기 때문에 library[0] = new Book();을 넣어 객체를 생성해서 오류를 해결하였다.

 

배열복사

arrarycopy(복사할 배열이름, 복사를 시작할 배열번호, 복사될 배열이름, 복사한 값을 넣을 배열번호, 복사할 배열의 길이)를 이용해 쉽게 배열을 복사할 수 있다.(얕은 복사)

 

얕은복사

위에서 쓴 arraycopy를 이용하여 배열을 복사하면 편리하지만 객체의 실제 값이 복사되는 것이 아니라 그 주소 값이 복사되므로 오른쪽 사진과 같이 bookArray1의 값을 변경하면 bookArray2의 값도 자동으로 바뀐다. 이를 얕은 복사라 한다.

 

깊은 복사

얕은 복사와 다르게 이번엔 bookArray2의 객체를 생성하여 for문을 통해 bookArray1의 실제 값을 복사하였다. 그 결과 bookArray1의 값을 바꿔도 bookArray2의 값은 바꾸지 않았기 때문에 결과가 그대로 출력되는 것을 볼 수 있다.

 

향상된 for문

기존의 for문과 다른 형식으로 String 타입의 배열에서 위와 같이 for(String 변수 : 배열이름)으로 배열을 복사할 수 있다.