ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java] 객체지향 - static과 접근 제어자
    java/[이론] 2022. 4. 7. 19:11

    자바공부: 문법+객체지향 프로그래밍 기법


    oop 기법
    1. 클래스 작성. -> 객체 표현
    class 클래스명{
       필드(멤버변수): 객체 갖는 값 저장(변수)
       메서드: 기능. 멤버변수의 변경하거나 반환하는, 출력...
    }


    역할:
    vo: 캡슐화. vo에 값을 담거나 vo 값을 읽음
    멤버변수(저장하고 싶은 값)  ,  생성자 최소 2개.  출력메서드


    dao: 데이터 처리(vo객체를 저장소에 저장, 수정, 검색, 삭제...)=> 중심:배열, db
    멤버변수: vo를 담을 배열
    메서드(기능): vo객체를 배열에 저장, 수정....


    service: 기능 구현. => 중심: 컨트롤러에 제공할 기능
    멤버변수: dao 객체
    메서드 : 컨트롤러에 제공할 기능


    controller(menu): 흐름제어. 사용자 선택에 따라서 전체적인 흐름을 제어하는 클래스
    main


    2. 메서드 오버로딩
    동일한 이름의 메서드 여러개 정의 가능
    메서드 이름은 기능을 표현. 동일한 기능은 이름이 같을 확률 높음.
    기능은 같지만 처리 데이터의 개수나 타입이 다른 메서드를 여러 개 정의 할 일이 많음.
    add_int()
    add_str()
    add_float()
    위와 같이 이름을 다르게 정의하는 것이 불편함
    => 메서드 오버로딩
    이름은 같지만 파라메터의 개수 또는 타입을 다르게 해야함.
    int add(int, int)
    String add(String, String)
    int add(int, int, int)


    add(2, 3);


    3. 생성자
    클래스와 이름이 동일한 메서드로 메서드 반환 타입이 없다. 
    객체 생성시에만 호출 가능
    클래스 정의 시 작성안하면 컴파일러가 디폴트 생성자를 만들어줌
    하지만 하나라도 정의하면 자동으로 안만들어 줌
    주로 멤버변수를 초기화하거나 초기화 코드 작성


    4. this
    클래스 정의 시 현재 객체의 이름 대신 사용하는 참조변수. 
    this는 객체 생성 시 그 객체의 참조값을 할당 받는다.
    주소 메서드의 파라메터 이름과 멤버변수의 이름이 동일 할때 멤버변수 구분
    생성자 호출(this())


    5. static
    static 메모리 특징: 프로그램 시작할때부터 끝날때 까지 존재. 
    동일한 클래스로 만들어진 모든 객체가 공용으로 사용. 
    초기화는 한번만 실행


    static 멤버 변수: 객체 생성 전 존재. 클래스 소속이기 때문에 클래스 이름으로 접근
    그 클래스로 만든 모든 객체가 공용으로 사용함


    static 메서드: 객체 생성 전 존재. 클래스 소속이기 때문에 클래스 이름으로 접근
    - 일반 메서드는 일반 멤버 변수, static 변수 모두 사용 가능
    - static 메서드는 일반 멤버 변수 사용 불가 . static 변수 모두 사용 가능
      일반 멤버 변수는 객체는 생성해야 존재하므로 이 메서드 호출 시 없을 수 있음.
    - 일반메서드는 일반메서드, static 메서드 모두 호출 할 수 있음
    - static 메서드는 일반 메서드 호출할 수 없고, static 메서드는 호출 할 수 있음


    6. 접근 제어자(visible)
    클래스나 멤버변수, 메서드들의 접근을 어디까지 허용할지 결정하는 제어자


    클래스: private, default, public
    멤버 변수/메서드: private, default, protected, public


    private: 현재 클래스 안에서만 보인다. 보통 멤버변수에 사용. => 멤버 변수의 직접 접근을 클래스 안으로 제한. 데이터 보호. 은닉성 제공. private 키워드 사용


    default: 같은 패키지 내에서는 보인다(사용가능). 패키지 밖에서는 안보임. 키워드 없음


    protected: 같은 패키지 내에서는 상속 상관없이 다 보인다(사용가능). 패키지 밖에서는 상속관계의 클래스에만 보임


    public: 패키지 상관없이 다 보임.

     

    package p1118;
    
    class Product {
    	int num;
    	String name;
    	int price;
    	int amount;
    	static int cnt;// 제품 개수 카운팅. 이 클래스로 만든 모든 객체가 공용으로 사용
    
    	Product() {
    		cnt++;
    		System.out.println(cnt + " 번째 객체 생성");
    	}
    
    	Product(int num, String name, int price, int amount) {
    		this.num = num;
    		this.name = name;
    		this.price = price;
    		this.amount = amount;
    		cnt++;
    		System.out.println(cnt + " 번째 객체 생성");
    	}
    
    	void printData() {
    		System.out.println("num:" + num);
    		System.out.println("name:" + name);
    		System.out.println("price:" + price);
    		System.out.println("amount:" + amount);
    	}
    }
    
    public class ObjCountTest_static {
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		Product[] p = { new Product(), new Product(1, "새우깡", 2000, 10), new Product(2, "캐모마일", 3000, 10),
    				new Product(3, "감자깡", 4000, 10) };
    		
    		System.out.println("총 제품 수:" + Product.cnt);
    
    		for (int i = 0; i < p.length; i++) {
    			p[i].printData();
    		}
    
    	}
    
    }
    package p1118;
    
    class Test2 {
    	int a;// default
    	private int b;
    	public int c;
    }
    
    class Test3 {
    	private String name;
    	private int age;
    	
    	// setter: 외부에서 private멤버 변수의 값을 설정. 파라메터로 받은 값을 멤버 변수에 할당하는 메서드.
    	public void setName(String name) {
    		this.name = name;
    	}
    
    	// getter: 멤버변수 값을 외부에서 읽을 수 있게 함 .반환타입은 멤버변수와 동일하고 멤버변수의 값 리턴만 함.
    	public String getName() {
    		return name;
    	}
    
    	public void setAge(int age) {
    		this.age = age;
    	}
    
    	public int getAge() {
    		return age;
    	}
    }
    
    public class PrivateTest {
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		Test2 t1 = new Test2();
    		t1.a = 1;
    		// t1.b = 2;
    		t1.c = 3;
    
    		Test3 tt = new Test3();
    		// tt.name="aaa";
    		tt.setName("aaa");
    		// System.out.println(tt.name);
    		System.out.println("name:" + tt.getName());
    		tt.setAge(10);
    		System.out.println("age:" + tt.getAge());
    	}
    
    }
    package p1118;
    
    class Product2 {
    	int num;
    	String name;
    	int price;
    	int amount;
    	static int cnt;// 제품 개수 카운팅. 이 클래스로 만든 모든 객체가 공용으로 사용
    
    	Product2() {
    
    	}
    
    	// 등록용 생성자
    	Product2(String name, int price, int amount) {
    		num = ++cnt;
    		this.name = name;
    		this.price = price;
    		this.amount = amount;
    	}
    
    	void printData() {
    		System.out.println("num:" + num);
    		System.out.println("name:" + name);
    		System.out.println("price:" + price);
    		System.out.println("amount:" + amount);
    	}
    }
    
    public class ProductNum_static {
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		Product2[] p = { new Product2("aaa", 500, 5), new Product2("bbb", 1500, 15), new Product2("ccc", 2500, 25) };
    		for (Product2 x : p) {
    			x.printData();
    		}
    	}
    
    }
    package p1118;
    
    class Test {
    	int a; //일반 멤버 변수. 객체 소속
    	static int b; //static 변수. 객체에 독립적으로 동작
    
    	void addAll() {
    		a++;
    		b++;
    	}
    	
    	void printAll() {
    		System.out.println("a:" + a);
    		System.out.println("b:" + b);
    	}
    }
    
    public class StaticMemberTest {
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		System.out.println(Test.b);
    		Test.b++;
    		//System.out.println(Test.a);=>에러
    		
    		Test t1 = new Test();
    		t1.addAll();
    		t1.printAll();
    		
    		Test t2 = new Test();
    		t2.addAll();
    		t2.printAll();
    		
    		Test t3 = new Test();
    		t3.addAll();
    		t3.printAll();
    	}
    
    }
    package p1118;
    
    class Calc {
    	static int add(int x, int y) {
    		return x + y;
    	}
    
    	static int sub(int x, int y) {
    		return x - y;
    	}
    
    	static int mul(int x, int y) {
    		return x * y;
    	}
    
    	static int div(int x, int y) {
    		return x / y;
    	}
    }
    
    public class StaticMethodEX {
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		int x=20, y=10;
    		//기능 위주의 클래스는 기능 메서드를 static으로 만들면
    		//객체 생성없이 바로 호출할 수 있어서 편하다. 
    		System.out.println(Calc.add(x, y));
    		System.out.println(Calc.sub(x, y));
    		System.out.println(Calc.mul(x, y));
    		System.out.println(Calc.div(x, y));
    		
    		System.out.println(Math.PI);
    		System.out.println(Math.abs(-10));
    	}
    
    }
    package p1118;
    
    class Test1 {
    	int a;
    	static int b;
    
    	void test1() {// 일반 메서드는 일반 멤버 변수 / static 변수 모두 사용 가능
    		System.out.println("test1()");
    		System.out.println("a:" + a);
    		System.out.println("b:" + b);
    	}
    
    	static void test2() { // static 메서드는 일반 멤버 변수 사용 불가 / static 변수 모두 사용 가능
    		// System.out.println("a:" + a); //일반 멤버 변수는 객체는 생성해야 존재하므로 이 메서드 호출 시 없을 수 있음.
    		System.out.println("test2()");
    		System.out.println("b:" + b);
    	}
    
    	void test3() { // 일반메서드는 일반메서드, static 메서드 모두 호출 할 수 있음
    		System.out.println("test3()");
    		test1();
    		test2();
    	}
    
    	static void test4() {// static 메서드는 일반 메서드 호출할 수 없고, static 메서드는 호출 할 수 있음
    		System.out.println("test4()");
    		// test1();
    		test2();
    	}
    }
    
    public class StaticMethodTest {
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		System.out.println("객체 생성 전");
    		Test1.b = 10;
    		System.out.println("Test1.b:" + Test1.b);
    		Test1.test2();
    		Test1.test4();
    		
    		System.out.println("객체 생성 후");
    		Test1 t = new Test1();
    		t.a = 20;
    		t.test1();
    		Test1.test2();   //t.test2();
    		t.test3();
    		Test1.test4();   //t.test4();
    		Test1 t1 = new Test1();
    		Test1 t2 = new Test1();
    	}
    
    }

     

    'java > [이론]' 카테고리의 다른 글

    [Java] final과 추상클래스 & 인터페이스  (0) 2022.04.07
    [Java] 객체지향 - 상속  (0) 2022.04.07
    [Java] 객체지향 - 오버로딩과 생성자  (0) 2022.04.07
    [Java] 함수와 메서드  (0) 2022.04.07
    [Java] 클래스  (0) 2022.04.07
Designed by Tistory.