[TOC]
< ์๋ฐ์ ๋งฅ๋ฝ >
๊ธฐ๋ณธํ๋ก๊ทธ๋๋ฐ
๊ฐ์ฒด์งํฅ๊ฐ๋
๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ
Java API
Thread / network programming
servlet / jsp
spring mvc
๊ธฐ๋ณธํ๋ก๊ทธ๋๋ฐ
๋ณ์ = ์ ์ฅ๊ณต๊ฐ์ ์ฌ๋ณผ์(๋ฉ๋ชจ๋ฆฌ์ฃผ์)
uml ์๋ฐ ์ฑ , cbd ์ฑ ์ถ์ฒ
java-oop/src/swap/SwapTest.java
int๋ฅผ ๋ณด๋ผ๊ฒฝ์ฐ, stack์์ญ์ ๊ฐ๊ฐ์ ๋ค๋ฅธ ๋ณ์๊ฐ ์๊น!
Value๊ฐ์ ๊ฒฝ์ฐ๋ heap์ ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ณ ๋ณ์๋ฅผ ๋ฌถ์ด์ ์ฃผ์๊ฐ์ ๋ณด๋ด๊ธฐ ๋๋ฌธ์
๊ฐ์ ์ฃผ์๋ฅผ ๊ฐ๋ฆฌํค๋ฉฐ, ๊ทธ ์ฃผ์์ ๊ฐ์ฒด์์ ๊ฐ์ ๋ณ๊ฒฝ์ํค๊ธฐ์ ๊ฐ๋ฅํจ!
paint/Point.java
package paint;
public class Point {
private int x;
private int y;
public Point() {
super();
} // ๊ธฐ๋ณธ ์์ฑ์๋ฅผ ๋ง๋ค์ด์ผํจ!
public Point(int x, int y) {
this.x = x;
this.y = y;
}
public void show() {
System.out.println("์ ( " + this.x + ", " + this.y + ")์ ์ ์ ์ฐ์์ต๋๋ค.");
}
}
paint/MainApp.java
package paint;
public class MainApp {
public static void main(String[] args) {
Point p1 = new Point(10, 20);
drawPoint(p1);
}
public static void drawPoint(Point point) {
point.show();
}
}
์ ( 10, 20)์ ์ ์ ์ฐ์์ต๋๋ค.
Point ์ ์ ์์๋ฐ์ ColorPoint๋ฅผ ๋ง๋ ๋ค!
Point.java >> getter, setter๋ฅผ ๋ง๋๋๊ฒ ์ข์ง๋ง ์ฐ์ต์ด๋๊น ๊ทธ๋ฅ protected!
protected int x;
protected int y;
paint/ColorPoint.java
public class ColorPoint extends Point {
private String color;
public ColorPoint(int x, int y, String color) {
super(x, y); // ๋ถ๋ชจ์ ๊ธฐ๋ณธ ์์ฑ์๊ฐ ์์๊ฒฝ์ฐ, ๊ฑฐ๊ธฐ ์๋ ์์ฑ์์ ๋ง์ถฐ ๋ฃ์ผ๋ฉด ๋จ
this.color = color;
}
@Override
public void show() {
System.out.println("์ขํ ( " + this.x + ", " + this.y + ")์ "+ this.color +"์ ์ ์ฐ์์ต๋๋ค.");
}
}
Point.java >> getter, setter๋ฅผ ๋ง๋๋๊ฒ ์ข์ง๋ง ์ฐ์ต์ด๋๊น ๊ทธ๋ฅ protected!
protected int x;
protected int y;
MaintApp.java
package paint;
public class MainApp {
public static void main(String[] args) {
Point p1 = new Point(10, 20);
// ์ ์ฐ๊ธฐ
drawPoint(p1);
ColorPoint p2 = new ColorPoint(50, 100, "red");
drawPoint(p2);
}
public static void drawPoint(Point point) {
point.show();
}
public static void drawPoint(ColorPoint colorPoint) {
colorPoint.show();
}
}
์ขํ ( 10, 20)์ ์ ์ ์ฐ์์ต๋๋ค. ์ขํ ( 50, 100)์ red์ ์ ์ฐ์์ต๋๋ค.
๊ทผ๋ฐ ์ฌ๊ธฐ์ ๋ฌธ์ !!
ColorPoint p2 = new ColorPoint(50, 100, "red");
์์ ๋ถ๋ชจ๋ก ๋ฐ์ผ๋ฉด ์ข์์??
Point p2 = new ColorPoint(50, 100, "red");
๊ทธ๋ผ Main์์ drawPoint()๋ฉ์๋ ์ค๋ฒ๋ก๋ฉ ํ ํ์ ์์!
MainApp.java
package paint;
public class MainApp {
public static void main(String[] args) {
Point p1 = new Point(10, 20);
// ์ ์ฐ๊ธฐ
drawPoint(p1);
Point p2 = new ColorPoint(50, 100, "red");
drawPoint(p2);
}
public static void drawPoint(Point point) {
point.show();
}
}
Point.java
public void show(boolean visible) {
if(visible) {
System.out.println("์ขํ (" + this.x + ", " + this.y + ")์ ์ ์ ์ฐ์์ต๋๋ค.");
}else {
System.out.println("์ขํ (" + this.x + ", " + this.y + ")์ ์ ์ ์ง์ ์ต๋๋ค.");
}
}
MainApp.java
p1.show(false);
p2.show(false);
p2.show(true);
๋ฅผ ๋ถ๋ฅด๋ฉด ์๊น์ ์ด ์์ฐํ๊ณ ๊ทธ๋ฅ ์ ๋ง ์ฐํ
--> ColorPoint.java ์์๋ ์ค๋ฒ๋ผ์ด๋ ํด์ผํจ!
Point.java ์์ ์ค๋ฒ๋ผ์ด๋๋ฅผ ์ด๋ฏธ ํ show() ๋ฉ์๋๋ฅผ ์ฌ์ฌ์ฉํ๋ฉด ๋จ!!
public void show(boolean visible) {
if(visible) {
//System.out.println("์ขํ (" + this.x + ", " + this.y + ")์ ์ ์ ์ฐ์์ต๋๋ค.");
show();
return;
}
System.out.println("์ขํ (" + this.x + ", " + this.y + ")์ ์ ์ ์ง์ ์ต๋๋ค.");
}
์ด์ ๋ถํด ์ขํ(๋ฐ์ดํฐ) ์ ๊ฒฝ ์์ฐ๊ณ ํ์ธ๋ง ํ๊ฒ ์
Triangle.java
package paint;
public class Triangle {
private int x1;
private int x2;
private int x3;
private int y1;
private int y2;
private int y3;
private String fillColor;
private String lineColor;
public void draw() {
System.out.println("์ผ๊ฐํ์ ๊ทธ๋ ธ์ต๋๋ค.");
}
}
MainApp.java
Triangle triangle = new Triangle();
drawTriangle(triangle);
public static void drawTriangle(Triangle triangle) {
triangle.draw();
}
๊ทผ๋ฐ! ์ผ๊ฐํ๋ง ๋ง๋ค๊ฑฐ์ผ?
์ฌ๊ฐํ, ์ค๊ฐํ .. ๋ฑ ๋ํ์ ๊ณ์ ์๊ธฐ์์
๋ํ์ ์ถ์ํด๋์ค๋ฅผ ์ฌ๋ฆฌ๋ฉด ์ด๋จ๊น?
Shape.java
package paint;
public abstract class Shape {
private String fillColor;
private String lineColor;
public abstract void draw();
}
ํ์ฌ ์ด๋ค ๋ํ์ ๊ทธ๋ฆด์ง ์์ง ๋ชฐ๋ผ, ๊ตฌํ์ ์์์๊ฒ ๋งก๊ธด๋ค!
Triangle.java
package paint;
public class Triangle extends Shape {
private int x1;
private int x2;
private int x3;
private int y1;
private int y2;
private int y3;
@Override
public void draw() {
System.out.println("์ผ๊ฐํ์ ๊ทธ๋ ธ์ต๋๋ค.");
}
}
Rect.java
package paint;
public class Rect extends Shape {
private int x1;
private int x2;
private int x3;
private int x4;
private int y1;
private int y2;
private int y3;
private int y4;
@Override
public void draw() {
// TODO Auto-generated method stub
System.out.println("์ฌ๊ฐํ์ ๊ทธ๋ ธ์ต๋๋ค.");
}
}
MainApp.java
package paint;
public class MainApp {
public static void main(String[] args) {
// ์ ์ฐ๊ธฐ
Point p1 = new Point(10, 20);
drawPoint(p1);
// ์๊น ์ ์ฐ๊ธฐ
Point p2 = new ColorPoint(50, 100, "red");
// drawPoint(p2);
p2.show(true);
// ์ ์ง์ฐ๊ธฐ
p1.show(false);
p2.show(false);
Shape triangle = new Triangle();
draw(triangle);
Shape rect = new Rect();
draw(rect);
}
public static void drawPoint(Point point) {
point.show();
}
public static void draw(Shape shape) {
shape.draw();
}
}
Circle.java
package paint;
public class Circle extends Shape {
private int x;
private int y;
private int radius;
@Override
public void draw() {
System.out.println("์์ ๊ทธ๋ ธ์ต๋๋ค.");
}
}
MainApp.java
Shape circle = new Circle();
draw(circle);
๋ฌธ์ !!
Point๊น์ง ํฌํจํ๋ ํด๋์ค๋ฅผ ๋ง๋ค๊ณ ์ถ์ผ๋ฉด
interface๋ฅผ ๋ง๋ค์ด์ผํจ
-> Shape๋ฅผ Point๊ฐ ์์๋ฐ์ผ๋ฉด fillColor ๋ฑ ํ์์๋๊ฒ๋ ์์๋ฐ์์ผํ์์!
Drawable.java
package paint;
public interface Drawable{
void draw();
}
Shape.java
package paint;
public abstract class Shape implements Drawable{
private String fillColor;
private String lineColor;
public abstract float calcArea();
// ์์์์ ์ค๋ฒ๋ผ์ด๋ ํ๋ฉด ๋จ
}
์์ ํด๋์ค๋ค
@Override
public float calcArea() {
return 0.f;
}
Point.java
package paint;
public class Point implements Drawable {
...
...
@Override
public void draw() {
show();
}
}
MainApp.java ์์
package paint;
public class MainApp {
public static void main(String[] args) {
// ์ ์ฐ๊ธฐ
Point p1 = new Point(10, 20);
draw(p1);
// ์๊น ์ ์ฐ๊ธฐ
Point p2 = new ColorPoint(50, 100, "red");
draw(p2);
// ์ ์ง์ฐ๊ธฐ
p1.show(false);
p2.show(false);
Shape triangle = new Triangle();
draw(triangle);
Shape rect = new Rect();
draw(rect);
Shape circle = new Circle();
draw(circle);
}
public static void draw(Drawable drawable) {
drawable.draw();
}
}
๋ฉ์๋ ํ๋๋ก ๋ชจ๋ ๋ค ์คํํ ์ ์๊ฒ๋จ!!!!!!
์ผ๋ง๋ ํ์ฅ์ฑ์ด ๋์์ง๊ณ ๊ฐํธํด ์ก๋์ง ๊ธฐ๋ฅ์ ์ถ๊ฐํด๋ณผ๊น??
GraphicString.java
package paint;
public class GraphicString implements Drawable {
private String text;
public GraphicString(String text) {
this.text = text;
}
@Override
public void draw() {
System.out.println(text + "๋ฅผ ๊ทธ๋ ธ์ต๋๋ค.");
}
}
MainApp.java
draw(new GraphicString("hello~~"));
์๋ ์ฝ๋ ์ถ๊ฐ, ์์ ์์ด ๋ฑ ํ์ค๋ก ํด๊ฒฐ ๊ฐ๋ฅ!
reflection : ๊ฐ์ฒด๊ฐ ์ด๋ค ํด๋์ค๋ก ์์ฑ๋๋์ง
package object.text;
public class ObjectTest01 {
public static void main(String[] args) {
Point p = new Point(10, 20);
System.out.println(p.getClass());
}
}
class object.text.Point
address ๊ธฐ๋ฐ์ hashing๊ฐ
: hashing? = ์๊ณ ๋ฆฌ์ฆ์ ๋นจ๋ฆฌ ์ฐพ๊ธฐ ์ํด์
๋งคํ์ผ๋ก ๋ณ์์ ์ ์ฅ๋๋ ๊ฐ์ reference๊ฐ์ด ๋ง์ง๋ง,
์ถ๋ ฅ์ผ๋ก ๋ณด์ฌ์ฃผ๋ ๊ฒ์ reference๊ฐ์ด ์๋๊ฑฐ๋ผ๊ณ ์ถ์ธกํ๋ค!
(๋ฌผ๋ก ์ฃผ์๋ ์๋๋ฏ)
System.out.println(p.hashCode());
366712642
getClass() + "@" + hashCode()
System.out.println(p);
System.out.println(p.toString());
println์ ๊ฐ์ฒด๋ฅผ ๋ฃ์ผ๋ฉด ์๋์ผ๋ก toString()์ ๋ถ๋ฌ์ด
object.text.Point@15db9742
๋ ๊ฐ์ฒด์ ๋์ผ์ฑ ๋น๊ต (๊ฐ์ ๊ฐ์ฒด๋!)
package object.text;
public class ObjectTest02 {
public static void main(String[] args) {
Point p1 = new Point(10, 20);
Point p2 = new Point(10, 20);
Point p3 = p2;
System.out.println(p1==p2);
System.out.println(p2==p3);
}
}
false true
๋ ๊ฐ์ฒด์ ๋์ง์ฑ์ ๋น๊ตํ๋ค. (๋ด์ฉ ๋น๊ต)
System.out.println(p1.equals(p2));
System.out.println(p2.equals(p3));
false true
โ ๋ญ์ผ! ๋ค ๊ฐ์๋ฐ ์ fasle๋์ค๋๋ฐ?
โ equals์ ์๋ ๊ตฌํ์ ๋์ผ์ฑ(==) ๊ณผ ๊ฐ๊ฒ ๊ตฌํ๋์ด์์ด
โ ๊ทธ๋์ ์ค๋ฒ๋ผ์ด๋๋ฅผ ํด์ค์ผํด ๋ด์ฉ๋น๊ต๋ฅผ ํ๊ณ ์ถ์ผ๋ฉด
Point.java -> alt+s ๋ก ์ค๋ฒ๋ผ์ด๋ ์ถ๊ฐ
...
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + x;
result = prime * result + y;
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Point other = (Point) obj;
if (x != other.x)
return false;
if (y != other.y)
return false;
return true;
}
@Override
public String toString() {
return "Point [x=" + x + ", y=" + y + "]";
} // ๋ด์ฉ๊ธฐ๋ฐ์ผ๋ก ์ค๋ฒ๋ผ์ด๋ฉ
equals๋ hashcode์ ๊ฐ์ด ์ค๋ฒ๋ผ์ด๋ ํด์ค์ผ ์ฑ๋ฅ์ด ์ข์์ง
-> ์ด๋ค ๊ฐ์ฒด์ ๋์ง์ฑ์ ๋น๊ตํ ๋๋ ํญ์ hashcode๋ฅผ ๋ฝ์์ ๋น๊ต๋ฅผํจ
// String
String s1 = new String("ABC");
String s2 = new String("ABC");
System.out.println(s1 == s2);
System.out.println(s1.equals(s2));
System.out.println(s1.hashCode() + " : " + s2.hashCode());
System.out.println(System.identityHashCode(s1) + " : " + System.identityHashCode(s2) );
false true 64578 : 64578 366712642 : 1829164700
๋ค๋ฅธ ๊ฐ์ฒด๋๊น ๋์ผ์ฑ์์ false
- identityHashCode : override๋๊ธฐ ์ ํด์์ฝ๋!
- HashCode๋ ๋ด์ฉ๊ธฐ๋ฐ
- identityHashCode ๋ ์ฃผ์๊ธฐ๋ฐ!
๊ทผ๋ฐ
String s = "ABC";
์ด๊ฑด ์ด๋ป๊ฒ ๊ฐ๋ฅํด! ๊ฐ์ฒด์ new๋ฅผ ์ํ๊ณ !!!!
String s3 = "ABC";
String s4 = "ABC";
System.out.println(s3 == s4);
System.out.println(s3.equals(s4));
System.out.println(s3.hashCode() + " : " + s4.hashCode());
System.out.println(System.identityHashCode(s3) + " : " + System.identityHashCode(s4) );
true true 64578 : 64578 2018699554 : 2018699554
๋ญ์ผ! ๋ด๋ถ์ ์ผ๋ก ์์์ new ํ๊ณ ๋ง๋ ๋ค๋ฉด,, ์ ์ด ๊ฐ์ด ๋ค ๊ฐ์๊ฑฐ์ผ?
--> String Constant Pool์ ์๊ฑฐ์น๊ธฐ๋๋ฌธ!!!
package object.text;
import java.util.HashSet;
import java.util.Set;
public class ObjectTest03 {
public static void main(String[] args) {
Set<Point> set = new HashSet<Point>();
Point p1 = new Point(10,20);
set.add(p1);
Point p2 = new Point(100,200);
set.add(p2);
Point p3 = p1;
set.add(p3);
for(Point p : set) {
System.out.println(p);
}
}
}
Point [x=100, y=200] Point [x=10, y=20]
๋ง์ฝ Point์ HashCode() ๋ฉ์๋๋ฅผ ์ง์ฐ๊ณ ์คํํ๋ฉด?
Point [x=100, y=200] Point [x=10, y=20] Point [x=10, y=20]
3๊ฐ๊ฐ ๋ค์ด๊ฐ!