글쓴이 :이원영 1998년 11월 03일 15:56:25
In Reply to: [질문] non-static reference... posted by 이홍락 on 1998년 11월 02일 13:53:34:
error의 직접적인 원인은 다음과 같습니다.
public static void main(String args[])에서
아래 부분을 고치셔야 합니다.
...
public static void main(String args[]) {
poly poly1= new poly(3.0,2,new poly(1.0,1,new poly(1.0,0)));
poly1.print();
add(poly1, poly1).print(); <== 이 부분!!
}
...
다음과 같이 고치세요.
===>
(poly1.add(poly1, poly1)).print();
혹은
poly sum = poly1.add(poly1, poly1);
sum.print();
조언:
1. Naming Rule
모든 Class이름은 첫자를 대문자로 하되
가능한 약자를 쓰지 마세요.
즉 Polynomial.class로 사용하세요.
2. 모든 class의 instance의 reference와 method는 첫자를
소문자로 시작하세요.
즉,
Polynomial p1 = new Polynomial("2x^2+3x+3");
Polynomial p2 = new Polynomial("4x^4+2x+5");
System.out.println("polynomial1: " + p1.toString());
System.out.println("polynomial2: " + p2.toString());
3. 좀더 신경을 쓰셔서 OO개념에 맞게 한 번
해 보시지요..
java.lang.Math Class를 잘 생각해 보세요.
즉 Polynomial.class는 polynominal을 저장/추출/print할 수
있는 method만 가지도록 하시고,
ExtendedMath.class는 Polynomial을 add, substract,
multiply, divide하는 static method를 갖도록 하는 겁니다.
즉 다음과 같은 형태의 문법이 나오겠죠?
...
Polynomial p1 = new Polynomial("2x^2+3x+3");
Polynomial p2 = new Polynomial("4x^4+2x+5");
Polynomial sum = ExtendedMath.add(p1, p2);
System.out.println("Summation: " + sum.toString());
...
4. 이렇게 하려면...???
음..
Polynomial.class는 다음과 같은 method가 있어야 할
것 같네요.
Constructions:
public Polynomial(); //new Polynomial();
public Polynomial(String p); // new Polynomial("2x^3+4x+1");
Methods:
public void set(String p); //p1.set("2x^3+4x+1");
public String toString(); // return "2x^3+4x+1";
public int[] getCoefficients(); // return [2,0,4,1];
public void setCoefficient(int index, int coeff);
public void addCoefficient(int index, int coeff);
public int getPower(); // return 3;
ExtendedMath class 는 static method들만 있으면
되겠죠.
Methods:
public static synchronized Polynomial add(Polynomial p1, Polynomial p2);
public static synchronized Polynomial substract(Polynomial p1, Polynomial p2);
public static synchronized Polynomial multiply(Polynomial p1, Polynomial p2);
public static synchronized Polynomial divide(Polynomial p1, Polynomial p2) throws Exception;
(divide는 zero polynomial로 나눌 수 없으니 Exception을
발생시킬 수도 있어야지요.)
아마 add method는 아래와 유사하리라 생각됩니다.
[ExtendedMath.java]
...
public static synchronized Polynomial add(Polynomial p1, Polynomial p2)
{
Polynomial result = new Polynomial();
int maxPowersOfPoly1 = p1.getPower();
int maxPowersOfPoly2 = p2.getPower();
int[] coeffOfPoly1 = p1.getCoefficients();
int[] coeffOfPoly2 = p2.getCoefficients();
int maxPowerLength = java.lang.Math.max(maxPowersOfPoly1, maxPowersOfPoly2);
for(int i=maxPowerLength; i>=0; i--){
if ( i <= maxPowersOfPoly1 ) {
result.addCoefficient(i, coeffOfPoly1[i]); // i번째의 Power항에 계수를 add.
}
if ( i <= maxPowersOfPoly2 ) {
result.addCoefficient(i, coeffOfPoly2[i]); // i번째의 Power항에 계수를 add.
}
}
return result;
}
substract method는 아래와 비슷하지 않을까요?
public static synchronized Polynomial substract(Polynomial p1, Polynomial p2)
{
Polynomial minusP2 = new Polynomial();
int maxPowersOfPoly2 = p2.getPower();
int[] coeffOfPoly2 = p2.getCoefficients();
for(int i=0;i<=maxPowersOfPoly2;i++){
minusP2.setCoefficient(i, - coeffOfPoly2[i]);
}
return ExtendedMath.add(p1,minusP2);
}
그 외 multiply는 그다지 어렵지 않을 겁니다. 하지만 divide가 문제죠?
열심히 해 보세요...
;)
Note: Polynomial class에는 Vector를 이용하세요.
즉,
[Polynomial.java]
public class Polynomial
{
Vector coefficients = null;
public Polynomial(){
coefficients = new Vector();
}
...
public void setCoefficient(int index, int coeff){
//만약 Vector size보다 큰 index에 넣을려면 size를 늘려야 겠죠?
if ( coefficients.size() < index+1) coefficients.setSize(index+1);
coefficients.setElementAt(new Integer(coeff), index);
}
public void addCoefficient(int index, int coeff){
//만약 Vector size보다 큰 index에 넣을려면 size를 늘려야 겠죠?
if ( coefficients.size() < index+1) coefficients.setSize(index+1);
int value = ((Integer)coefficients.elementAt(index)).intValue();
coefficients.setElementAt(new Integer(coeff + value), index);
}
//음 그리구요 아마 하시다 보면 계수가 0인 녀섯이 앞에 있는 경우는
//removeElementAt(index)로 제거 해주어야 할 거예요...
....