클래스 메서드
/*
* static 멤버 : static으로 지정한 멤버 변수 or 멤버 메서드
* static 변수(정적변수, 클래스 변수)
* static 영역 : 클래스 파일(*.class)의 bytecode가 로드되는 장소
* class가 로드될 때 클래스 내부에 정의된 클래스 변수의 클래스 메서드는 할당 및 초기화됨
* 객체의 생성없이 바로 접근(사용)할 수 있음
* → static 영역에 존재하는 변수와 메서드는 객체가 생성되기 이전에 이미 할당되어 있기 때문
* static 키워드를 통해 static영역에 할당된 변수와 메서드는 모든 객체가 공유해서 사용
*/
//231211
package test6_4;
/*
* 클래스 멤버와 인스턴스 멤버 간의 참조와 호출
* 클래스 멤버(클래스 변수, 클래스 메소드) 존재하는 시점은 처음 클래스가 메모리에 올라갈 때
* 클래스 멤버는 존재
* 인스턴스 멤버(인스턴스 변수, 인스턴스 메소드)는 객체를 생성해야만 존재할 수 있음
* 인스턴스 멤버는 객체를 생성하기 전까지는 존재하고 있지 않음
*/
public class Check {
static int cv = 5; //클래스 변수, 객체를 생성하지 않아도 사용이 가능함
int iv = 10; //인스턴스 변수, 객체를 생성해야 사용이 가능함, 객체를 호출해서 사용
//클래스 메소드 현재 존재하고 있는 메소드. 바로 호출해서 사용 가능
static void cm() {
System.out.println("클래스 메소드");
System.out.println("객체를 생성하지 않아도 호출이 가능한 메소드");
}
//인스턴스 메소드. 객체를 생성하고 객체 내에서 호출해야만 사용 가능
void im() {
System.out.println("인스턴스 메소드");
System.out.println("객체를 생성해야만 객체 내에서 호출이 가능한 메소드");
}
}
//231211
package test6_4;
public class CheckMain {
public static void main(String[] args) {
//클래스 멤버에 접근(클래스명.메소드)
System.out.println(Check.cv);
Check.cm();
System.out.println("-----------");
//인스턴스 멤버에 접근
Check ck = new Check();
System.out.println(ck.iv);
ck.im();
System.out.println("-----------");
System.out.println("인스턴스 멤버는 클래스 멤버에 접근 가능");
System.out.println(ck.cv);
ck.cm();
}
}
변수 유효 범위
지역변수(로컬 변수, local variable)의 유효범위
함수나 메서드 내부에 선언하기 때문에 함수 밖에서는 사용할 수 없음
즉, 하나의 함수에 선언한 지역 변수는 다른 함수에서 사용할 수 없음
지역 변수가 생성되는 메모리를 스택(stack), 스택에 생성되는 지역 변수는 함수가 호출될 때 생성되었다가
함수가 반환되면 할당되었던 메모리 공간에 해제되면서 함께 없어짐
public static void main(String[] args) {
int x = 10; // 지역 변수 x 선언
if (x > 5) {
int y = 20; // 지역 변수 y 선언
System.out.println("x: " + x + ", y: " + y);
}
// System.out.println(y); // 에러: y는 if 블록 내에서만 유효
}
멤버 변수(인스턴스 변수, instance varialbe)의 유효 범위
멤버 변수는 클래스가 생성될 때 힙(heap) 메모리에 생성되는 변수,
멤버 변수는 클래스의 어느 메서드에서나 사용할 수 있음
힙에 생성된 인스턴스가 가비지 컬렉터(garbage collector)에 의해 수거되면 메모리에서 사라짐
따라서 클래스 내부의 여러 메서드에서 사용할 변수는 멤버 변수로 선언하는 것이 좋음
// 멤버 변수는 클래스 수준에 선언
int memberVariable = 10;
public static void main(String[] args) {
// 멤버 변수를 사용하는 인스턴스 생성
MemberVariableExample instance = new MemberVariableExample();
// 멤버 변수에 접근
System.out.println("Member variable in main: " + instance.memberVariable);
// 다른 메서드에서도 멤버 변수 사용
instance.anotherMethod();
}
public void anotherMethod() {
// 멤버 변수에 접근 가능
System.out.println("Member variable in anotherMethod: " + memberVariable);
}
static 변수(클래스 변수, class variable)의 유효 범위
사용자가 프로그램을 실행하면 메모리에 프로그램이 상주, 이때 프로그램 영역 중에 데이터 영역이 있음
이 영역에는 상수나 문자열, static 변수가 생성
인스턴스 변수는 객체가 생성되는 문장 즉 new가 되어야 생성되지만,
static 변수는 클래스 생성과 상관없이 처음부터 데이터 영역 메모리에 생성
따라서 인스턴스 변수와 static 변수는 사용하는 메모리가 다름
// static 변수는 클래스 수준에 선언
static int staticVariable = 5;
public static void main(String[] args) {
// main 메서드에서 static 변수 사용
System.out.println("Static variable in main: " + staticVariable);
// 다른 메서드에서 static 변수 사용
anotherMethod();
}
public static void anotherMethod() {
// 다른 메서드에서도 static 변수 사용 가능
System.out.println("Static variable in anotherMethod: " + staticVariable);
}
싱글톤 패턴
인스턴스를 단 하나만 생성하는 디자인 패턴을 싱글톤 패턴이라고 함
static을 용해 프로그램 전반에서 사용하는 인스턴스를 하나만 구현하는 방식
싱글톤 패턴으로 클래스 구현
생성자를 private으로 만들기
package singleton;
public class Company {
private Company() {}
}
클래스 내부에 static으로 유일한 인스턴스 생성하기
package singleton;
public class Company {
private static Company instance = new Company(); //유일하게 생성한 인스턴스
private Company() {}
}
외부에서 참조할 수 있는 public메서드 만들기
package singleton;
public class Company {
private static Company instance = new Company(); //유일하게 생성한 인스턴스
private Company() {}
//인스턴스를 외부에서 참조할 수 있도록 public get()메서드 구현
public static Company getInstance() {
if(instance == null) {
instance = new Company();
}
return instance; //유일하게 생성한 인스턴스 반환
}
}
실제로 사용되는 코드 만들기
package singleton;
public class CompanyTest {
public static void main(String[] args) {
Company c1 = Company.getInstance();
Company c2 = Company.getInstance();
System.out.println(c1 == c2);
}
}
package test6_5;
public class Singleton {
private static Singleton instance = new Singleton();
private int id;
String name;
private Singleton(){
this.id = 1000;
this.name = "java";
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public static Singleton getInstance() {
System.out.println("객체 리턴");
return instance;
}
}
package test6_5;
public class SingletonMain {
public static void main(String[] args) {
//Singleton sgt = new Singleton(); 객체 생성 못함
Singleton sgt = Singleton.getInstance();
}
}
배열과 ArrayList
배열
자료를 순차적으로 관리하는 구조
배열선언
배열을 사용하려면 먼저 배열을 선언해야함
배열도 자료형과 함께 선언
배열을 이루는 각각의 자료를 배열 요소라고 함
배열 요소는 자료형이 모두 같음
저장하려는 자료의 성격에 맞게 자료형을 정하고 선언하려는 배열 요소 개수만큼 []안에 작성
new 예약어는 배열을 새로 만들라는 의미
자료형[] 배열이름 = new 자료형[개수];
또는
자료형 배열이름[] = new 자료형[개수];
ex)
//int형 요소가 10개인 배열 선언
int[] studentIDs = new int[10];
배열을 선언하면 선언한 자료형과 배열 길이에 따라 메모리가 할당
배열 초기화
배열을 선언하면 그와 동시에 각 요소의 값이 초기화됨
배열의 자료형에 따라 정수는 0, 실수는 0.0, 객체 배열은 null로 초기화되며,
특정값으로 초기화할 수 도 있음.
배열이 초기화 요소의 개수만큼 생성되므로 []안의 개수는 생략
ex)
int[] studentIDs = new int[] {101,102,103}; //개수를 생략
int[] studentIDs = new int[3] {101,102,103}; //값을 넣어 초기화할 때 []안에 개수를 쓰면 오류 발생
int[] studentIDs = {101,102,103}; //int형 요소가 3개인 배열 생성
하지만 같은 배열의 자료형을 먼저 선언하고 초기화하는 경우에는 new int[]를 생략할 수 없음
int [] studentIDs; //배열 자료형 선언
//studentIDs = {101,102,103}; 오류 발생
studentIDs = new int[] {101,102,103}; //new int[]를 생략할 수 없음
배열 사용
선언한 배열의 각 요소에 값을 넣을 때나 배열 요소에 있는 값을 가져올 때는 []를 사용
studentID[0] = 10; //배열의 첫 번째 요소에 값 10을 저장
인덱스 연산자[]
[]는 배열을 처음 선언할 때 사용한 연산자. 배열 이름에 []를 사용하는 것을 인덱스 연산이라고 함
인덱스 연산자의 기능은 배열 요소가 저장된 메모리 위치를 찾아주는 역할
변수 이름으로 변수가 저장된 메모리 위치를 찾는 것처럼, 배열에서 [i] 인덱스 연산을 하면
i번째 요소의 위치를 찾아 해당 위치의 메모리에 값을 넣거나 이미 저장되어 있는 값을 가져와서 사용할 수 있음
num[2]=25; //num 배열의 세 번째 요소에 값을 25로 저장
age = num[2]; //age 변수에 num 배열의 세 번째 요소값을 저장
배열의 순서는 0번부터
배열 길이가 n이라고 하면, 배열 순서는 0번부터 n-1까지임
0번 요소의 배열의 첫 번째 요소라고 함
package arrary;
public class ArrayTest {
public static void main(String[] args) {
int[] num = {1,2,3,4,5,6,7,8,9,10};
System.out.println(num.length); //num 배열 길이
for(int i = 0 ; i < num.length; i++) {
System.out.println(num[i]);
}
}
}
배열은 배열 길이를 나타내는 length 속성을 가지는데, 배열 길이는 처음에 선언한 배열의 전체 요소 개수를 의미
전체 길이를 알고 싶은 배열 이름 뒤에 .연산자를 붙이고 length 속성을 쓰면 배열 길이를 반
전체 배열 길이와 유효한 요소 값
전체 배열 길이와 현재 배열에 유효한 값이 저장되어 있는 배열 요소가 같다고 혼동하면 안됨
package arrary;
//배열 길이만큼 출력
public class ArrayTest2 {
public static void main(String[] args) {
int[] data = new int[5]; //int형으로 길이 5인 배열 선언
data[0]=1;
data[1]=2;
data[2]=3;
for(int i = 0; i<data.length; i++) {
System.out.println(data[i]);
}
}
}
정수 배열과 실수 배열은 별도로 초기화하지 않고 선언하면 배열의 요소 값은 0으로 초기화 됨
배열의 네 번째, 다섯번째 요소에는 값을 저장하지 않았기 때문에 0이 출력되는 것을 알 수 있음
즉 배열의 세 번째 요소까지만 유효한 값이 저장
package arrary;
//배열의 유효한 요소 값 출력
public class ArrayTest3 {
public static void main(String[] args) {
int[] data = new int[5];
int size = 0; //유효한 값이 저장된 배열 요소 개수를 저장할 변수 선언
data[0]=1; size++;
data[1]=2; size++;
data[2]=3; size++;
for(int i = 0; i<size; i++) {
System.out.println(data[i]);
}
}
}
객체 배열 사용
동일한 기본 자료형 변수 여러 개를 배열로 사용할 수 있듯이 참조 자료형 변수도 여러 개를 배열로 사용할 수 있음
객체 배열은 기본 자료형 배열(int, char,..)과 사용 방법이 조금 다름
package arrary;
public class Book {
private String bookName;
private String author;
public Book() {} //디폴트 생성자
//책 이름과 저자 이름을 매개변수로 받는 생성자
public Book(String bookName, String author) {
this.bookName = bookName;
this.author = author;
}
public String getBookName() {
return bookName;
}
public void setBookName(String bookName) {
this.bookName = bookName;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public void show() {
System.out.println(bookName+ ", "+ author);
}
}
package arrary;
public class BookArray {
public static void main(String[] args) {
Book[] book = new Book[5]; //Book 클래스형으로 객체 배열 생성
//인스턴스 생성 후 배열에 저장
book[0] = new Book("수학의 정석", "홍성대");
book[1] = new Book("하늘과 바람과 별과 시", "윤동주");
book[2] = new Book("소나기", "황순원");
book[3] = new Book("홍루몽", "조설근");
book[4] = new Book("토지", "박경리");
//Book 인스턴스를 저장한 메모리 공간 주소
for(int i = 0; i < book.length; i++) {
System.out.println(book[i]);
}
//Book 인스턴스 멤버
for(int i = 0; i < book.length; i++) {
book[i].show();
}
}
}
'KDT > Java' 카테고리의 다른 글
231214 Java (0) | 2023.12.14 |
---|---|
231213 Java (0) | 2023.12.13 |
231207 Java (0) | 2023.12.07 |
231206 Java (0) | 2023.12.06 |
231204 Java (0) | 2023.12.04 |