KDT/Java

231211 Java

001cloudid 2023. 12. 11. 12:52
728x90

클래스 메서드

/*

* 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();

 

 

 

 

}

}

그림 1. 클래스 메소드, 인스턴스 메소

 

 

변수 유효 범위

지역변수(로컬 변수, 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();

}

 

 

}

 

}

그림 2. 객체 배열 만들기

 

 

728x90

'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