1. 접근 제어자
: 클래서, 메서드, 멤버 변수 들을 어디까지 접근할 수 있도록 허용할 것인지 결정
클래스: default, public
메서드/멤버변수: private(멤버변수), default, public, protected
private --- 클래스 안에서만 보임. (클래스 밖에서는 사용 불가, 상속 불가) -- 은닉성 제공 (데이터 보호)
- 클래스 밖에서 직접적으로 값을 보거나 수정할 순 없지만,
우회적으로 public 메서드인 setter와 getter로 값 수정 가능.
default --- 키워드없음. 다른 클래스에서도 사용 가능하지만, 같은 패키지에 있는 클래스에서만 보임
public --- 같은 & 다른 패키지 모두 보임. (전체오픈) (메소드)
protected --- 같은 패키지에서는 보임. 다른 패키지에서는 상속관계의 클래스에만 보임.
1-1. setter
: private 멤버에 (class 밖에서) 값 할당하는 public 메서드
-- private 변수 값을 함부로 수정할 수 없게 조건을 걸 수 있음.
ex) 비밀번호에 아이디와 같은 문자 입력 불가능
ex) 돈에 음수(-) 입력 불가능
public void set멤버변수명(멤버변수와 동일한 타입 변수) {
this.변수명 = 변수명; // 값 할당
}
=========================
public void setId(String id) {
this.id = id;
}
Member m1 = new Member();
m1.setId("aaa");
1-2. getter
: private 멤버의 값을 반환하는 public 메서드
>> class 밖에서 private 멤버의 값을 읽을 수 있게 하기 위함.
public 멤버와같은반환타입 get멤버변수명 () {
return 멤버변수값;
}
=======================
public String getId () {
return id;
}
Member m1 = new Member();
System.out.println(m1.getId());
class Member {
private String id;
...
public Member() {}
public Member(String id) {
this.id = id;
}
public void setId(String id) { // setter
this.id = id;
}
public String getId() { // getter
return id;
}
.....
@Override
public String toString() {
return id + "/" + pwd + "/" + email + "/" + type;
}
}
main() {
Member m1 = new Member(); // 클래스타입 변수 선언. new로 디폴트생성자 호출(객체 초기화).
m1.setId("aaa");
System.out.println(m1.getId());
Member m2 = new Member("bbb", "1111", "asdf", 2); // 클래스타입 변수선언. new로 파라메터생성자 호출(값 할당)
System.out.println(m2.getPwd());
}
class PrivateTest2 {
private int a;
private String b;
//setter
public void setA(int a) {
this.a = a;
}
public void setB(String b) {
this.b = b;
}
// getter
public int getA() {
return a;
}
public String getB() {
return b;
}
public void printData() {
System.out.println("a: " + a);
System.out.println("b: " + b);
}
}
public class PrivateTest2Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
PrivateTest2 pt = new PrivateTest2();
pt.printData();
// pt.a = 10;
// pt.b = "aaa";
pt.setA(10);
pt.setB("bbb");
pt.printData();
//private 멤버 클래스 밖에서 사용 불가
//System.out.println("pt.a: " + a);
System.out.println("pt.a: " + pt.getA());
System.out.println("pt.b: " + pt.getB());
}
}
=============================
(print)
a: 0
b: null
a: 10
b: bbb
pt.a: 10
pt.b: bbb
** setter & getter 자동생성
Source > Generate Getters and Setters...
// 번호 입력받는 product
class Product2 {
// 멤버변수는 모두 private
private int num;
private String name;
private int price;
private int amount;
public Product2() {
}
public Product2(int num, String name, int price, int amount) {
super();
this.num = num;
this.name = name;
this.price = price;
this.amount = amount;
}
// Source > Generate Getters and Setters...
// getter setter 자동생성
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
public int getAmount() {
return amount;
}
public void setAmount(int amount) {
this.amount = amount;
}
@Override
public String toString() {
return "Product2 [num=" + num + ", name=" + name + ", price=" + price + ", amount=" + amount + "]";
}
}
public class VoTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
Product2 p = new Product2();
//디폴트 생성자로 만들었을 땐 setter로 private멤버 값 설정
p.setNum(1);
p.setName("새우깡");
p.setPrice(1000);
p.setAmount(5);
//getter로 private 멤버 출력
System.out.println("번호: " + p.getNum()); //p.num과 같은 개념!
System.out.println("제품명: " + p.getName());
System.out.println("가격: " + p.getPrice());
System.out.println("수량: " + p.getAmount());
// 초기화 생성자로 생성하여 private 멤버 값을 바로 설정
Product2 p2 = new Product2(2, "감자깡", 2000, 10);
// 객체 출력. toString 반환 문자열 출력
System.out.println(p2);
}
}
=========================================
(print)
번호: 1
제품명: 새우깡
가격: 1000
수량: 5
Product2 [num=2, name=감자깡, price=2000, amount=10]
2. 싱글톤 SingleTone
: 생성자가 private인 클래스 => 클래스 밖에서 객체 생성(호출) 불가.
- 외부에서 객체 생성하는 것을 막으면 ==> 자원 관리 용이 (함부로 클래스 수정 불가)
(주로 db를 연결할 때 사용)
- 이 객체를 외부에 전달할 getInstance() 메서드를 제공해야 함.
------- 외부에서 호출할 때 객체 생성시 .getInstance(); 써서 호출.
- 내부에서 객체 하나를 생성해서 이것을 공용으로 사용.
=> 생성자 -> private --> 클래스 밖에서 객체 생성(호출) 불가
=> 내부에서 만든 객체 -> static --> 모든 객체가 사용 (공용 사용)
class Test {
private static Test t1 = new Test();
private Test() {
}
public static Test getInstance() {
return t1;
}
}
------------- main{} --------------
// Test t1 = new Test(); // error!!
Test t1 = Test.getInstance();
import java.util.Calendar;
import java.util.Date;
//싱글톤 -> 객체 여러개 생성 방지, 메모리&자원 관리해서 불필요한 사용 줄이기 위해.
class SingleTone {
// 객체를 내부에서 만든다.
// 만든 객체는 static 변수에 담는다. 하나의 객체를 공용으로 사용.
private static SingleTone s = new SingleTone();
private int x = 10;
// 생성자 private => 객체를 외부에서 생성하지 못하게 함.
private SingleTone() {
}
// 내부에서 만든 객체를 반환
public static SingleTone getInstance() {
return s;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
}
public class SingleToneTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
// SingleTone s = new SingleTone();
SingleTone s = SingleTone.getInstance();
s.setX(50);
System.out.println(s.getX());
// Calendar c = new Calendar();
Calendar c2 = Calendar.getInstance(); //single tone 클래스
Date d = c2.getTime();
System.out.print((d.getYear()+1900) + "년 ");
System.out.print(d.getMonth() + "월 ");
System.out.println(d.getDate() + "일");
}
}
============================
(print)
50
2023년 1월 22일
--------------------------------
▼ DB connect 예
package conn;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
//싱글톤
public class DBConnect {
private static DBConnect dbconn = new DBConnect();
// @db서버주소:리스너번호/sid
// localhost : 내 컴퓨터 // 프로젝트 시 ip주소
private String url = "jdbc:oracle:thin:@localhost:1521/xe";
private DBConnect() {}
public static DBConnect getInstance() {
return dbconn; // 모든 db작업을 이 conn 객체로 실행
}
//db 연결할 때 쓰는 클래스. Connection 타입으로 반환.
public Connection conn() {
try {
//드라이버 로드
Class.forName("oracle.jdbc.OracleDriver");
//세션수립 (로그인)
return DriverManager.getConnection(url, "hr", "hr");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
}
3. 문자열 비교
객체를 == 으로 비교하면 참조값만 비교함.
===> 객체를 비교할 때는 ==으로 하면 안됨!
==> String을 비롯한 객체는 .equals() 로 비교!! --- object클래스 (상속)
A.equals(B)
! A.equals(B) --- not equals
public class StringTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
String a = "aaa";
String b = "aaa";
String c = "bbb";
String d = new String("aaa");
System.out.println("a==b: " + (a == b));
System.out.println("a==c: " + (a == c));
System.out.println("a==d: " + (a == d));
System.out.println("a.equals(d): " + a.equals(d));
System.out.println("a 참조값: " + a.hashCode());
System.out.println("b 참조값: " + b.hashCode());
System.out.println("c 참조값: " + c.hashCode());
System.out.println("d 참조값: " + d.hashCode());
}
}
========================================
(print)
a==b: true
a==c: false
a==d: false
a.equals(d): true
a 참조값: 96321
b 참조값: 96321
c 참조값: 97314
d 참조값: 96321