국비학원 6일차 : 클래스 변수, 메서드

Digeut·2023년 3월 2일
0

국비학원

목록 보기
6/44

클래스 변수

클래스에서 변수

인스턴스 변수
각각의 인스턴스마다 고유하게 가지고 있어야하는 속성을 지정할때 사용

클래스 변수
해당 클래스로 만들어진 모든 인스턴스가 동일하게 가지고 있어야하는 속성을 지정할때 사용 클래스가 메모리에 로딩될 때 생성되어 프로그램이 종료될 때까지 유지된다. 인스턴스 변수 앞에 static 붙인다.

지역 변수
메서드 내에서 선언된 변수(인스턴스변수와 클래스 변수는 전역변수)

class GalaxyPhone{
	//인스턴스 변수 : 인스턴스마다 고유하게 가지고 있는 속성
	//인스턴스 변수는 꼭 인스턴스 생성 후에 사용가능!
	String model;
	String owner;
	String telNumber;
	
    //클래스 변수(static변수): 해당 클래스로 생성된 모든 인스턴스가
    //동일하게 가지고 있는 속성
	// static 데이터 타입 변수명;
	// 클래스 변수는 인스턴스 생성없이 클래스로 사용이 가능
    // 인스턴스 변수에서도 접근 가능🤔
	static String maker = "SAMSUNG"; //생성 및 초기화
    /*인스턴스 변수와 표시도 다르게 나타남*/
	//클래스 변수는 만들때부터 초기화해주는게 제일 좋다.
class MoniterSize{
	//final int HEIGHT = 1080; 
    //인스턴스 변수 ->인스턴스를 생성해야한다!
	//인스턴스 변수를 사용하면 매번 인스턴스 생성해줘야한다.
	//생성안하고 바로 사용할수 있게하려면 클래스 변수로 생성해주면 된다
	
    static/*클래스 변수*/ final int HEIGHT = 1080; 
    //클래스 변수로 생성!
    
	//final int WIDTH = 1920;
	static final int WIDTH = 1920; //클래스 변수
	//특정한 값을 지정해놓고 외부에서 사용할 때 제일 많이쓰이는 형태
}
public class VariableMethod {
	
	//VariableMethod 클래스의 전역변수(global)
	int number = 10;
	
    //메인메서드
	public static void/*반환타입이 없다*/ main(String[] args)/*선언부*/ {
		
		//main 메서드의 지역변수
		double decimal = 10.0;
		
		int size = MoniterSize.HEIGHT * MoniterSize.WIDTH;
		
		GalaxyPhone myS23 = new GalaxyPhone(); //인스턴스 생성
        //생성된 인스턴스에 인스턴스 변수 사용
		myS23.model = "S23";
		myS23.owner = "홍길동";
		myS23.telNumber = "010-1111-1111";
		
		GalaxyPhone myS22 = new GalaxyPhone(); //인스턴스 생성
        //생성된 인스턴스에 인스턴스 변수 사용
		myS22.model = "S22";
		myS22.owner = "김철수";
		myS22.telNumber = "010-2222-2222";
		
		System.out/*클래스변수*/.println(myS23.telNumber);
        // 010-1111-1111
		System.out.println(myS22.telNumber);
        // 010-2222-2222
		
		myS23.maker = "SAMSUNG"; //클래스변수
		
		System.out.println(myS23.maker);
		System.out.println(myS22.maker); 
		//클래스 변수를 인스턴스 변수로 접근해서 노란줄의 경고가 뜬다
        //System.out.println(GalaxyPhone.maker)로
        //클래스 변수로 접근하면 노란줄 뜨지 않는다.
        
		//myS23의 maker만 바꿨는데 둘다 메이커가 삼성으로 되어있다.
		//클래스 변수인 maker는 모든 인스턴스를 동일하게 가지고 있어 
        //myS22와 myS23이 모두 바뀌게 된다.
  
		//클래스 변수는 독립적인 저장공간을 확보하고 있고, 
        //그곳의 메모리 주소를 바라보게 된다.
		System.out.println(GalaxyPhone.maker);

메서드

특정 작업을 수행하는 일련의 문장들을 하나로 묶은것
작업을 미리 작성해둔 것
메서드에 넣을 값과 반환값만 알면 된다.(Black Box구조)

메서드의 장점

  1. 높은 재사용성
    (클래스도 높은 재사용성, 변수에 있어서 속성값 저장하는쪽 관련)
    한번 만들어 놓은 메서드를 반복해서 사용 가능
  2. 중복 코드 제거
    반복적으로 나타나는 문장들을 메서드로 만들어서 사용하면 코드의 중복을 제거할 수 있고 수정이 발생하면 하나의 코드만 수정하면 된다.
  3. ☆ 프로그램을 구조화
    작업 단위로 여러개의 메서드에 담아서 프로그램을 구조화 할 수 있다
  4. 메서드로 특정한 기능에 이름을 붙여 놓을 수 있다.
class HigherMathematics { //변수 선언할때 파파고로 번역해서 표현하는 경우 많다
	
	static final double PIE = 3.14; 
    //전역변수 : 이렇게 지정하면 밑에 전부 다 쓸수 있다. 
	//static으로 선언해두면 인스턴스와 스태틱에서 다 
    //사용가능하다.? 클래식으로도 접근가능.?
    //->static 변수는 인스턴스 변수와 인스턴스 메서드에서 활용 가능!
    //클래스 메서드에서는 인스턴스 변수 활용 금지
	
	//클래스 변수와 마찬가지로 메서드에 static을 포함하게 되면
	//클래스 메서드로 사용할 수 있음. (즉 클래스로 접근할 수 있다)
	
	static double getTriangleSize(double underside, double height) {
		//입력을 받은 모든 메서드는 검증을 먼저 해야한다!!
		//검증 : 밑변과 높이는 무조건 양수여야한다!
		if (!(underside > 0) || !(height > 0)) {
			System.out.println("밑변과 높이는 양수여야 합니다.");
			return 0;
		}
		double size = 0.5 * underside * height;
		height = 12; 
        //⭐메서드 내에서 바꿔도 호출시에는 바뀌지 않는다? 영향없다?
		return size;
	}
	
	static double getCircleSize(double radius) { 
		
		/*검증*/if (radius <=0) {
			System.out.println("반지름은 양수여야합니다.");
			return 0;
		}
        
		//final double PIE = 3.14; 
        //지역변수 :매번 써야하고 블록을 벗어나면 적용되지 않는다
        
        //static double getCircleSize으로 선언해서 
        //인스턴트 생성안해도 되니까 
        //non static인 PIE 쓸수없다고 빨간줄뜬다
		//그래서 전역변수 final double PIE = 3.14;도 static으로 바꿔준다.
		double size = PIE * radius * radius ;
		return size;
	}
	
	static double getCircumFerence(double radius) {
		
		/*검증*/if (radius <=0) {
			System.out.println("반지름은 양수여야합니다.");
			return 0;
		}
		
		//final double PIE = 3.14; 
        //지역변수 :매번 써야하고 블록을 벗어나면 적용되지 않는다
		double circumference = PIE * 2 * radius;
		return circumference;
	}
}

메서드의 선언과 구현

public class Method1 {

	//메서드의 선언부 
	// [접근제어자 기타제어자] 반환타입 메서드명 
    //([매개변수/*외부로부터 데이터 받고자 할때*/[, ...]]) 
	public static void/*반환타입*/ main(String[] args) 
	
	//메서드의 구현부
	//실제 프로그램의 절차를 작성하는 부분
	//return 데이터; 로 결과를 반환시켜줌
	// (반환타입이 void이면 return;으로 메서드를 종료시킴)
	{
		//메서드 쓰려면 인스턴스 생성해야한다! 
        //매번 쓸때마다 불러와야한다 ->번거롭다
		// 메서드 작성시 static을 붙이면 인스턴스 생성없이 
        //클래스로 불러올수 있다!
        
        //static 선언 안했을때 인스턴스 생성
		//HigherMathematics math = new HigherMathematics(); 
        
		//double size = math.getTriangleSize(10, 10); 
        //매개변수의 데이터 타입과 같아야한다.
		/*메서드에 static으로 생성해서 인스턴스 생성없이도 바로 사용가능*/
		
        int height = 10 ; 
        //메서드 호출, 호출 시 인자로 전달한 값이 메서드의 매개변수에 각각 복사!됨
		//⭐그래서 원본 메서드 내에서 12로 바꿔도 적용되지 않는다!?
		//double size = HigherMathematics.getTriangleSize(10, height); //
		
        double size = HigherMathematics.getTriangleSize(10, 10);
		System.out.println(size);
		
        //double circleSize = math.getCircleSize(5);
        //static선언 했으므로 클래스로 접근.
        double circleSize = 
        	HigherMathematics.getCircleSize(5);
		System.out.println(circleSize);
		

실습

class Triangle {
	double underside; //인스턴스 변수
	double height;
	double digonal;
	
	double area;
	double circumference;
}

class TriangleMath {
	
    // 파라미터로 참조변수를 받는다면 메모리 주소가 복사되서 넘어오기 때문에
	// 실제 작업도 해당 메모리 주소에서 작업을 진행함
	// 실제 데이터가 변경된다.
    
	//메서드
	static void setArea(/*매개변수 참조형으로 받기*/Triangle triangle) {
		double area = 0.5 * triangle.underside * triangle.height;
		triangle.area = area;		
	}
    
	//함수 깔끔하게 만들어두기 클린코드의 중요성
	static void setDiagonal(Triangle triangle) {
		double squareDiagonal = Math.pow(triangle.underside, 2) + Math.pow(triangle.height, 2);
		double diagonal = Math.sqrt(squareDiagonal);
		triangle.diagonal = diagonal;
	}
	//함수 깔끔하게 만들어두기2 클린코드의 중요성
	static void setCircumference(Triangle triangle) {
		triangle.circumference = triangle.height + triangle.underside + triangle.digonal;
	}
    
    //메서드 (void말고 다른 타입으로 반환)
	static Triangle creatTriangle(double underside, double height) {
		Triangle triangle = new Triangle(); //인스턴스 힙영역에서 생성 (다른 공간) 
		//함수가 종료되도 메모리 바뀌지 않는다
		
		triangle.underside = underside;
		triangle.height = height;
		///*함수*/triangle.digonal = Math.sqrt((Math.pow(underside, 2) 
        			+ Math.pow(height, 2)));
		setDiagonal(triangle);
		setArea(triangle);
		///*함수*/triangle.circumference = triangle.underside 
        				+ triangle.height + triangle.digonal;
		setCircumference(triangle);
		
		return triangle;
	}
}

public class Method2 {

	public static void main(String[] args) {
		Triangle triangle1 = new Triangle(); //인스턴스 생성
		triangle1.underside = 3;
		triangle1.height = 4;
		triangle1.digonal = 5;
		
		TriangleMath.setArea(triangle1);
		System.out.println(triangle1.area);
		
		Triangle triangle2/*주소가 저장되어 있다*/ =
        				TriangleMath.creatTriangle(5, 5);
		System.out.println(triangle2.area);
		
	}

}
profile
개발자가 될 거야!

0개의 댓글