JAVA는 1991년 썬 마이크로시스템즈의 제임스 고슬링에 의해 탄생한 객체 지향적 프로그래밍 언어이다. 처음에는 가전제품 내에 탑재해 동작하는 프로그램을 위해 개발 했지만 현재는 웹 어플리케이션 개발에 가장 많이 사용하는 언어 가운데 하나로 발전하였다.
JAVA는 다양한 네트워크 분산 환경에서 어플리케이션을 실행하기 위해 개발 되었다. 이러한 과제 중 가장 중요한 것은 최소한의 시스템 리소스를 사용하고 모든 하드웨어 및 소프트웨어 플랫폼에서 실행할 수 있으며 동적으로 확장 가능한 어플리케이션을 제공하는 것 이었다.
JAVA의 목표는 작고,신뢰할 수 있고,쉽게 이식할 수 있는 OS 플랫폼을 개발하는 것이었다. 처음 프로젝트를 시작할 때 전 세계적으로 C++가 주류 언어로 사용되고 있었지만 C++이 가지고 있던 어려움은 새로운 언어 플랫폼의 필요성을 느끼게 했다. JAVA는 SmallTalk, Objective C, Cedar/Mesa 등 다양한 언어에서 디자인과 구조를 가져와 객체 지향적인 언어로 설계되었다.
OOP to me means only messaging, local retention and protection and hiding of state-process, and extreme late-binding of all things.
Dr. Alan Kay on the Meaning of "Object-Oriented Programming"
"local retention" is a new notion to me in the context of OOP, and I assume it refers to state-process and means that an object is in possession of its state-process, so that the state of an object is kept locally with the object and not elsewhere.
Dr. Alan Kay on the Meaning of "Object-Oriented Programming"
Computation is performed by objects communicating with each other, requesting that other objects perform actions. Objects communicate by sending and receiving messages. A message is a request for action bundled with whatever arguments may be necessary to complete the task.
Usually, the specific receiver for any given message will not be known until run time, so the determination of which method to invoke cannot be made until then. Thus, we say there is late binding between the message (function or procedure name) and the code fragment(method) used to respond to the message
An Introduction To Object Oriented Programming
"polymorphism" was imposed much later (I think by Peter Wegner) and it isn't quite valid, since it really comes from the nomenclature of functions, and I wanted quite a bit more than functions. I made up a term "genericity" for dealing with generic behaviors in a quasi-algebraic form.
I didn't like the way Simula I or Simula 67 did inheritance though I thought Nygaard and Dahl were just tremendous thinkers and designers). So I decided to leave out inheritance as a built-in feature until I understood it better.
The second phase of this was to finally understand LISP and then using this understanding to make much nicer and smaller and more powerful and more late bound understructures.
Dr. Alan Kay on the Meaning of "Object-Oriented Programming"
하지만 2003년 앨런케이와 스테픈 람이 주고 받은 이메일을 살펴보면 앨런 케이는 다형성은 함수의 명명법에서 나온 것이기 때문에 객체지향의 핵심 개념으로는 타당하지 않으며 Simula의 상속을 좋아하지 않았기 때문에 LISP에 대한 이해를 통해 동적 바인딩을 만들었다.
앨런 케이가 지향한 객체 지향 프로그래밍과 자바에서 지향한 객체 지향 프로그래밍을 구분할 필요가 있으며 자바에서 생각하는 핵심 가치인 다형성과 상속은 결국 동적 바인딩을 더 잘 활용하기 위해 새롭게 도입된 개념이 아닌가 라는 생각이 든다.
class Point extends Object {
private double x; /* instance variable */
private double y; /* instance variable */
Point() { /* constructor to initialize to zero */
x = 0.0;
y = 0.0;
}
/* constructor to initialize to specific value */
Point(double x, double y) {
this.x = x;
this.y = y;
}
public void setX(double x) { /* accessor method */
this.x = x;
}
public void setY(double y) { /* accessor method */
this.y = y;
}
public double getX() { /* accessor method */
return x;
}
public double getY() { /* accessor method */
return y;
}
}
Point myPoint; // declares a variable to refer to a Point object
myPoint = new Point(); // allocates an instance of a Point object
myPoint.setX(10.0); // sets the x variable via the accessor method
myPoint.setY(25.7);
class ThreePoint extends Point {
protected double z; /* the z coordinate of the point */
ThreePoint() { /* default constructor */
x = 0.0; /* initialize the coordinates */
y = 0.0;
z = 0.0;
}
ThreePoint(double x, double y, double z) {/* specific constructor */
this.x = x; / *initialize the coordinates */
this.y = y;
this.z = z;
}
}
class Rectangle extends Object {
static final int version = 2;
static final int revision = 0;
}
class Human{
//Overridden Method
public void walk()
{
System.out.println("Human walks");
}
}
class Demo extends Human{
//Overriding Method
public void walk(){
System.out.println("Boy walks");
}
}
class Test {
public static void main( String args[]) {
// Reference is of Human type and object is Boy type
Human obj = new Demo();
// Reference is of HUman type and object is of Human type.
Human obj2 = new Human();
obj.walk();
obj2.walk();
}
}
Boy walks
Human walks