객체지향개념I-2

윤재열·2022년 1월 8일
0

Java

목록 보기
10/71

변수

선언위치에 따른 변수의 종류

  • 변수의 선언위치가 변수의 종류와 범위(scope)를 결정한다.
public class Variables{
publicint iv;	//인스턴스변수
public static int cv;	//클래스변수(static변수, 공유변수)

public void method(){
int lv =0;	//지역변수
}
}

인스턴스변수(instance variable)
-각 인스턴스의 개별적인 저장공간. 인스턴스마다 다른 값 저장가능
-인스턴스 생성 후, '참조변수. 인스턴스변수명'으로 접근.
-인스턴스를 생성할 때 생성되고, 참조변수가 없을 때 가비지컬렉터에 의해 자동제거된다.
-인스턴스가 생성될 때마다 생성되므로 인스턴스마다 각기 다른 값을 유지할수 있다.

클래스변수(class variable)
-같은 클래스의 모든 인스턴스들이 공유하는 변수
-인스턴스 생성없이 '클래스이름.클래스변수명'으로 접근.
-클래스가 로딩될 때 생성디고 프로그램이 종료될 때 소멸
-모든 인스턴스가 하나의 저장공간을 공유하므로 항상 공통된 값을 갖는다.

class Card{
    String kind;
    int number; //인스턴스변수
    static int width = 100;
    static int height = 250;    //클래스변수(static변수)
}
public class CardTest {
    public static void main(String[] args) {
        Card c1 =new Card();
        c1.kind ="Heart";
        c1.number = 7;
        Card c2 = new Card();
        c2.kind= "Diamond";
        c2.number = 5;
        System.out.println("c1은"+c1.kind+ ","+c1.number+"이며 크기는"+c1.width+","+c1.height+"입니다.");
        System.out.println("c2은"+c2.kind+ ","+c2.number+"이며 크기는"+c2.width+","+c2.height+"입니다.");
        c1.width=50;	//인스턴스변수 width,heigh를 50,80으로 변경
        c1.height=80;
        System.out.println("c1은"+c1.kind+ ","+c1.number+"이며 크기는"+c1.width+","+c1.height+"입니다.");
        System.out.println("c2은"+c2.kind+ ","+c2.number+"이며 크기는"+c2.width+","+c2.height+"입니다.");
    }
}

지역변수(local variable)
-메서드 내에 선언되며, 메서드의 종료와 함께 소멸
-조건문,반복문의 블럭{} 내에 선언된 지역변수는 블럭을 벗어나면 소멸

메서드

-작업을 수행하기 위한 명령문의 집합
-어떤 값을 입력받아서 처리하고 그 결과를 돌려준다.
-반복적인 코드를 줄이고 코드의 관리가 용이하다.
-반복적으로 수행되는 여러 문장을 메서드로 작성한다.
-하나의 메서드는 한가지 기능만 수행하도록 작성한다.
-관련된 여러 문장을 메서드로 작성한다.

메서드 정의하는방법

메서드는 클래스 영억에만 정의할 수 있다.

return문

현재 실행 중인 메서드를 종료하고 호출한 메서드로 되돌아간다.

  • 메서드가 정상적으로 종료되는 경우.
    1.메서드의 블럭{}의 끝에 도달했을 때
    2.메서드의 블럭{}을 수행 도중 return문을 만났을 때.


return문 사용할때 주의사항
1.반환값이 있는 메서드는 모든 경우에 return문이 있어야 한다.

2.return문을 적절히 사용하면 코드가 간결해진다.

메서드의 호출

참조변수.메서드 이름(); //메서드에 선언된 매개변수가 없는 경우
참조변수.메서드 이름(값1,값2,값3....); //메서드에 선언된 매개변수가 있는 경우

public class MyMath {
    long add(long a, long b){
        long result = a+b;
        return result;
        //return a+b;

    }
}
class MM{
    public static void main(String[] args) {
        MyMath mm = new MyMath();

        long value =mm.add(1L,2L);//매개변수가 있는 경우

        System.out.println(value
        );
    }
}

기본형 매개변수와 참조형 매개변수

기본형 매개변수 - 변수의 값을 읽기만 할 수 있다.

class Data{ int x;}
public class ParameterTest {
    public static void main(String[] args) {

        Data d = new Data();

        d.x = 10;
        System.out.println("main(): x = " + d.x);

        change(d.x);
        System.out.println("After change(d.x)");
        System.out.println("main() : x = " + d.x);
    }
        public static void change(int x){
            x = 1000;
            System.out.println("change() : x = "+x);
        }
    }

조형 매개변수 - 변수의 값을 읽고 변경할 수 있다.

class Data2{int x;}
public class ParameterTest2 {
    public static void main(String[] args) {

        Data d = new Data();

        d.x = 10;
        System.out.println("main(): x = " + d.x);

        change(d);
        System.out.println("After change(d.x)");
        System.out.println("main() : x = " + d.x);
    }
    public static void change(Data d){
        d.x = 1000;
        System.out.println("change() : x = "+d.x);
    }
}

클래스메서드(staic메서드)와 인스턴스메서드

  • 인스턴스메서드
    -인스턴스 생성 후, '참조변수.메서드이름()'으로 호출
    -인스턴스변수나 인스턴스메서드와 관련된 작업을 하는 메서드
    -메서드 내에서 인스턴스변수 사용가능
  • 클래스메서드(static메서드)
    -객체 생성없이 '클래스이름.메서드이름()'으로 호출
    -인스턴스변수나 인스턴스메서드와 관련없는 작업을 하는 메서드
    -메서드 내에서 인스턴스 변수 사용불가
    -메서드 내에서 인스턴스변수를 사용하지 않는다면 static을 붙이는 것을 고려.
public class ClassMethod {
    public int a, b;

    public int add(){   //인스턴스메서드(인스턴스변수사용)
        return a+b;
    }
    public static int times(int a,int b){   //클래스메서드(static메서드)
        return a * b;                       
    }
}
public class ClassMethodTest {
    public static void main(String[] args) {
        System.out.println(ClassMethod.times(20,10));   //클래스메서드 호출

        ClassMethod cm = new ClassMethod(); //인스턴스 생성
        cm.a=20;    //인스턴스 변수
        cm.b=10;
        System.out.println(cm.add());   //인스턴스메서드 호출
    }
}

멤버간의 참조와 호출

같은 클래스의 멤버간에는 객체생성이나 참조변수 없이 참조할 수있다. 그러나 static멤버들은 인스턴스멤버들을 참조할 수 없다.

메서드 오버로딩(method overloading)

하나의 클래스에 같은 이름의 메서드를 여러 개 정의하는 것을 메서드 오버로딩,간단히 오버로딩이라고한다.

  • 조건
    1.메서드의 이름이 같아야 한다.
    2.매개변수의 개수 또는 타입이 달라야 한다.
    3.매개변수는 같고 리턴타입이 다른경우에는 오버로딩이 성립되지 않는다.
System.out.println() 메서드
다양하게 오버로딩된 메서드를 제공함으로써 모든 타입의 변수를 출력할 수 있도록 설계
  • 매개변수의 이름이 다른 것은 오버로딩이 아니다.
    -int add(int a, int b){ return a+b }
    -int add(int x, int b){ return x+y } //매개변수 타입이 같아 오버로딩이 불가능
  • 매개변수의 타입이 다르므로 오버로딩이 성립한다.
    -long add(int a,long b){ return a+b }
    -long add(long a,int b){ return a+b }
profile
블로그 이전합니다! https://jyyoun1022.tistory.com/

0개의 댓글