인스턴스 변수
각각의 인스턴스마다 고유하게 가지고 있어야하는 속성을 지정할때 사용
클래스 변수
해당 클래스로 만들어진 모든 인스턴스가 동일하게 가지고 있어야하는 속성을 지정할때 사용 클래스가 메모리에 로딩될 때 생성되어 프로그램이 종료될 때까지 유지된다. 인스턴스 변수 앞에 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구조)
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);
}
}