웹개발 기초/java기초

자바 class 문제 예시

미미_밍 2024. 1. 21. 21:53

 

 

클래스() 

공통요소를 번만 선언해놓고 가져다 사용만 하도록 설계한다. 

 

1. 타입이다. 

클래스 안에 선언된 변수와 메소드를 사용하고 싶다면 

해당 클래스 타입으로 객체를 선언해야 한다. 

2. 주어이다. 

원숭이가 바나나를 먹는다. 

Monkey.eat(“바나나”) 

 

*모든 클레스는 자료형이다. 

*클래스 안에 선언된 변수 = 필드 라고한다. 

*클래스이름() : 생성자, 필드 힙메모리에 클레스를 올려준다. , 앞글자 대문자이면 생성자! 

*객체에는 주솟값이 들어간다. 

 

 

클래스 선언

class 클래스명{

필드 (변수, 메소드)

}

 

 

클래스의 필드사용 

 

1. 객체화(instance) : 

- 객체(instance variable) 만드는 작업.객체를 통해 class에 접근가능

- 추상적인 개념을 구체화 시키는 작업.

- 클래스명 객체명 = new 클래스명(); 

                                     —————

                                     생성자

 

객체명.필드명;  이렇게 사용 

* .(마침표) : 하위연산자, 멤버변수(필드) 접근 연산자 , 

주솟값 뒤에서만 사용이 가능하며 해당 주소를 참조하는 명령어이다. 

 

 

2. static 키워드를 사용하여 클래스 이름으로 직접 접근할 있다. 

    static 필드는 컴파일러가 최초 번만 메모리에 올려주기 때문에 

    객체로 접근할 필요가 없다. 이러한 필드를 static 필드라고 부른다. 

 

 

생성자 

클래스 이름 뒤에 소괄호가 있는 형태 , 메소드와 기능이 똑같지만 메소드라고 부르지 않는다.

 

* 리턴 불가 , 주솟값을 리턴해야 하기 때문

 

1. 해당 클래스의 필드를 메모리에 할당한 부여된 주소값을 가져온다. 

 

인스턴스가 생성될때 호출되는 인스턴스 초기화 메서드이다. 

인스턴스 변수들을 초기화해줌.

*모든 class 에는 하나 이상의 생성자가 있어야함

기본생성자(빈 생성자) or 초기화 생성자(메서드처럼 값을 받아 초기화 하는 생성자)

 

기본 생성자 

매개변수가 없는 생성자이며, 클래스 선언시 자동으로 선언된다. 

사용자가 직접 생성자를 선언하게 되면 자동으로 만들어지지 않는다. 

 

 

this 

필드에 접근한 객체가 누구인지 알아야  해당 필드에 접근할 있다. 

접근한 객체가 가지고 있는 할당된 필드의 주소값을 this 라는 변수에 자동으로 담긴다. 

 

 

package staticTest;


class Data {
	int data = 10; 
	static int data_s = 10; 
	
	void increase() {
		System.out.println(++data);
	}
	
	static void increase_s() {
		System.out.println(++data_s);
	}
}

public class SteticTest {
	
	public static void main(String[] args) {
		
		Data data1 = new Data(); 
		
		data1.increase();
		data1.increase();
		data1.increase();
		data1.increase();
		data1 = new Data(); 
		data1.increase();
		data1.increase();
		data1.increase();
		
		
		Data.increase_s();
		Data.increase_s();
		Data.increase_s();
		Data.increase_s();
		data1 = new Data(); 
		Data.increase_s();
		Data.increase_s();
		Data.increase_s();
		Data.increase_s();
		Data .increase_s();
	}
}

 

1번은 new Data() 를 했을때 heap 메모리에 재할당되서 data가 10으로 초기화된다. 

 

 

package staticTest;

class Company {
	static int money ; 
	String name; 
	int age; 
	int income; 
	
	public	Company(String name, int age) {
		this.name = name; 
		this.age = age; 
	}
}


public class StaticTask {
	public static void main(String[] args) {
		Company employ1 = new Company("강민정",25); 
		Company employ2 = new Company("강아름",23); 
		
		employ1.income = 10_000; 
		employ2.income = 2_000; 
		
		Company.money += employ1.income;
		Company.money += employ2.income;
		
		System.out.println(employ1.money);
		System.out.println(employ2.money);
	}
	
}

 

Company.money 처럼 static 은 모든 인스턴스가 공용으로 사용하는 변수다. 

대형 회사일때 각 분점(?) 이 벌어들이는 수입은 다르지만

총 수입은 모두를 더한값임으로 각 분점에서 더해줘야 한다 .

즉, 인스턴스와 상관없는 class 의 변수라 생각하면 된다. 

 


 

Storage class (저장 기억 부류) 

 

Stack                                

지역변수, 매개변수                      

함수 호출과 함께 할당되며 호출 완료하면 소멸함.

*컴파일시 크기 결정          

 초기화 : 직접

생명주기 : } 

 

 

 Data 영역

 전역변수, 정적변수(static) 

초기화 : 자동

생명주기 : new, 프로그램이 끝날때

 

 

heap Data 영역

사용자에 의해 메모리 동적 할당

런타임시 크기 결정 

 

 

*static 모든 객체가 공유해야 하는 필드에서만 사용한다. 

 

* 자바에서 랜덤함수는?

package randomTest;

import java.util.Random;

public class RandomTest {
	public static void main(String[] args) {
		Random random = new Random(); 
		random.nextInt(10); 
	}
}

 

 


 

 

다형성(polymorphism) 

1. 오버로딩 (OverLoading)

매개변수의 개수 또는 타입이 다르면 동일한 이름의 메소드로 선언할 있다. 

 

 

package classTest;

class A{
	int data; 
	
	public A(int data) {
		this.data = data; 
	}
	
	public A() {
		
	}
	
	void printdata() {
		System.out.println(data);
		System.out.println(this.data);
	}
	
	
}

public class ClassTest {
	
	public static void main(String[] args) {

		//객체화  

		A a = new A(10);
		a.printdata(); 
		
		A b = new A(); 
		b.printdata();
		
		
		
		System.out.println(a);
		System.out.println(b);

	}

	
}

 

 

기본생성자와 초기화 생성자 둘다 만들어 준다. 

매개 변수가 있는 생성자를 사용하고 싶을때는 초기화생성자를, 

없는 생성자를 사용하고싶을때는 기본생성자를 써준다. 

 

* 변수 앞 this 숨겨져 있다. 

 

package classTest;

import java.util.Scanner;

class SuperCar{
	//브랜드
	String brand; 
	//색상
	String color; 
	//가격
	long  price;
	//엔진
	boolean engin = true; 
	//비번
	String password; 
    //비밀번호 오류 횟수 
	int errorCount; 
	
	//기본생성자
	public SuperCar() {
		;
	}
	
	
	//static 블록 어떤 생성자든 최초 한번만 
	static {
		System.out.println("출고 축하드립니다.");
		
	}
	
	
	//초기화 블록 어떤생성자 호출되도 실행됨, 호출 될때마다 
	{
		this.password = "0000"; 
	}
	
	//초기화 생성자 
	public SuperCar(String brand, String color, long price) {
		this.brand = brand;
		this.color = color; 
		this.price = price; 

	}
	
	//초기화 생성자 오버로딩 
	
	public SuperCar(String brand, String color, long price, String password) {
		super();
		this.brand = brand;
		this.color = color;
		this.price = price;
		this.password = password;
	}



	//시동 켜기 
	//사용자가 입력한 비번이 맞을때만 시동켜기, 연속3회 실패시 경찰출동 
	void enginstart() {
		
		engin = true;  
		
		}
		
	//시동 끄기 
	void enginstop() {
		engin = false; 
	}
    
    
	//비밀번호 맞는지 확인
	public boolean checkpassword(String password){
		return this.password.equals(password); 
	}
}
		
		
public class ClassTask {
	public static void main(String[] args) {
		SuperCar ferrari = new SuperCar("ferrari","Red",7_0000,"initialPassward");
		Scanner sc = new Scanner(System.in); 
		int choice = 0; 
		String password = null ;
		
		while(true) {
			System.out.println("1. 시동켜기 \n 2. 시동끄기");
			choice = sc.nextInt(); 
		
		
			

			
			if(choice==1) { //시동켜기 
				
				if(!ferrari.engin) {
					System.out.println("비밀번호");
					password = sc.next();
					if(ferrari.checkpassword(password)) {
						ferrari.enginstart();
						System.out.println(ferrari.brand + "시동켜짐");
					}
					else {
						ferrari.errorCount++; 
						if(ferrari.errorCount>2) {
							System.out.println("경찰출동");
						}
						break;
					}
				}
				else {
					System.out.println("시동이 이미 켜져있습니다.");
				}
			}
			else if(choice==2) { //시동끄기
				if(ferrari.engin) {
					ferrari.enginstop();
					System.out.println(ferrari.brand+"시동꺼짐");
				}
				else
					System.out.println("이미 켜져있습니다.");
			}
				
			}
			
		
		
	}
}

// supercar class 를 만들어주고 브렌드,색상,가격,엔진on-off상태,비밀번호,비밀번호오류횟수 멤버변수를 만들어줌

 

 // static block 한번만 호출되는 코드일때 쓴다. 객체가 생성되기 전 한번만 호출.

주로 class 변수 초기화 시키는 코드 둠.(class 변수(static)은 자동 초기화되지 않는다. 인스턴스변수만 자동초기화됨)

-> 출고 축하 메세지 날리기 

 

//초기화 블록 , 생성자 호출시 실행됨

-> password 변수만 초기화 해준다. (기본값)

 

// 기본생성자, 초기화생성자를 만들어주고 , password 가 필요할지 모르니 초기화생성자를 오버로딩해서 password 도 넣어줌

 

//시동켜기 , 끄기 

->입력한 비번이 맞을때만 시동켜줌, 3회연속 틀리면 경찰출동

여기서는 기능만 구현해줌 if 같은 조건문은 main 메소드에서 검사할것.

 

//비밀번호확인

->.equals() 써서 확인 

 

=> main 함수안에서 사용자 동작 구현

class 안에서는 화면에서 쓸만한거 만들어 놓고 조작은 화면에서 하자